本篇参考:

https://help.salesforce.com/articleView?id=000339361&type=1&mode=1

https://developer.salesforce.com/wiki/apex_code_best_practices

https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_limits.htm

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_transaction.htm

背景

还记得前几年刚开始接触sf的时候,对标准的功能一点都不懂,因为从java转过来,侧重点大部分在开发上面。所以连Account那些基本表都不清楚,sales cloud等更没有概念。好在那时候经常看apex开发文档,所以开发入手特别快。
转眼都已经做sf 5年多了,回首一下以前的博客,大部分都是某个特定case的实现方式,一些新知识的探索,但是一直没有涉足过apex government limitation的,这些在最开始的开发时很多概念很模糊,很不懂,所以未来几篇侧重点在limitation的介绍上,以便新人可以更好的理解这些,老人也重(同样)温(恶补)一下。最开始做sf classic的开发时,工作多年的大拿很少没有不处理过 cpu limit / heap size limit等等各种各样的问题,本篇先以CPU limitation开始,后续其他的主要的争取都简单介绍,温故而知新,保证开发动手以前可以先多多的思考。
话不多说,今天主要讲两个内容。 Transcation & CPU Limitation

一. Transcation

我们经常会听到前辈们给新人讲salesforce相关的 limitation。一个transcation中SOQL查询回来的数量最多50000条啊,DML最多10000条啊等等。新人肯定很努力的记住相关的关键字, SOQL 搜索50000,DML 10000。 且慢,还有一个关键点,transcation是什么?作为新人真的理解吗?

我们严格的说 transcation的时候,前面都会加 apex transcation,即用apex写代码的时候,才涉及到transcation的概念。比如某些公司前后端分离,你做纯粹的 aura / lwc前端,不需要考虑后端的小伙伴,肯定会想, transcation?excuse me?

是的,transcation的概念只有在apex上下文的情况下才会有这个概念,下文中出现的【transcation】和【事务】是同一个东西,在这里进行说明一下。transcation是什么先卖个关子,先说一下他具有什么特性呢?
transcation有一个主要的特性:transcation中的所有DML操作要么成功完成,要么在一个操作中发生错误,整个事务被回滚,没有数据提交到数据库,当然这种处理我们通常使用 Database.savePoint以及rollback去处理代码逻辑。
既然大前提是apex上下文,所以我们思考一下,我们平时写apex的代码都会有哪些场景?
trigger / apex class / 匿名块 / vf page调用 / web service,如果不全欢迎补充,所有上述的这些可以理解成 transcation的边界,即事务的边界,我们在事务边界内发生的所有操作都表示单个操作单元。
这个时候引出一下官方对transcation的定义:表示作为单个单元执行的一组操作。即上述事务边界执行的所有的操作。

所以我们思考一个场景,我们一个匿名块里面调用了一个类的静态方法,这个静态方法做了一个表的DML操作,这个表同时还有 validation rule / trigger 巴拉巴拉很多操作。当调用了这个方法,执行了DML操作,这个数据最终 commit并且这个静态方法完全执行完,然后最终这个匿名块的所有的逻辑全执行完才算做当前的一个事务结束,这样是否会好点理解呢?

二. CPU Limitation

一个transcation情况下,同步场景10s,异步场景60s。限制是死的不用太纠结,我们只需要知道,哪些会被计入CPU limitation,哪些不会被计入即可。

会被记入的有以下情况:

  • 所有的apex代码
  • apex公开的所有的资源库里面的函数
  • workflow的执行

不会被计入的有以下的情况:

  • 数据库操作。比如花费在DML/SOQL/SOSL的时间就不会被计入进去
  • apex callout等待时间也不会被算进去

所以既然我们知道了哪些场景会被记入,哪些不会被记入,如果真涉及到CPU 调优的场景,尽可能的往以下的场景去优化。官方给了几个场景的sample:

1. Using Map based query:这种场景用于当我们搜索 list出来以后,还需要获取相关的ID作为列表去进行后续操作,官方建议我们别对list for循环继续操作了,通过map去接收,然后使用 keySet以及values去同时获取到id和数据集合。等会还要对它进行引申,先看一下官方的代码。

List<Account> lstacc=[Select Id,Name from Account limit 50000];
Set<Id> setIds=new Set<Id>();
for(Account a:lstacc){ //More CPU time for sure due to looping
setIds.add(a.id);
} //Using Map query saves CPU time //Fetching all account in map
Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creating list of accounts
List<account> accList = aMap.values() ; //Creating set of ids Set<id> accIds = aMap.keySet() ;

2. 如果业务允许的情况下去异步处理,因为异步的CPU limit是60s,时间更充裕。比如部分代码放在 @future里面。但是放在异步的没法保证实时性以及回滚等操作,需要具体业务具体分析,别盲目选择。

3. 业务允许探索一下SOQL聚合的用法,这个很好理解,因为SOQL查询时间不计算在CPU limitation里面。salesforce提供了一些聚合函数等,比如我们场景需要这些,我们可以直接通过SOQL进行聚合,而不是搜索出来以后列表进行处理。

4. 尽量减少不必要的loop操作,如果不可避免,保证数据最少原则,只对需要的数据列表进行操作,从而减少迭代的量,减少CPU使用时间。

看完以后诚惶诚恐的感觉有没有,恨不得想知道我们现有的代码CPU时间用了多少,还有多少时间限制??? apex提供了 Limits这个类来捕捉大部分的government limitation的限制数。比如我们可以通过Limits.getCpuTime()去获取当前时段已经用了多少CPU时间,以ms来计算。
当然,官方推荐的肯定优秀,不代表我们就一定适合当前的场景去进行优化。下面举个例子,希望小伙伴看完拥有自己的思考。我们针对第一个的demo做一下debug,分别打印出来代码执行的CPU limit 以及 heap size limit

第一个代码块

List<Account> lstacc=[Select Id,Name from Account limit 50000];
Set<Id> setIds=new Set<Id>();
for(Account a:lstacc){ //More CPU time for sure due to looping
setIds.add(a.id);
}
system.debug('cpu limit' + Limits.getCpuTime());
system.debug('heap size:' + Limits.getHeapSize());

第二个代码块

//Fetching all account in map
Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creating list of accounts
List<account> accList = aMap.values() ; //Creating set of ids Set<id> accIds = aMap.keySet() ;
system.debug('cpu limit' + Limits.getCpuTime());
system.debug('heap size:' + Limits.getHeapSize());

执行以后发现了什么???

第一个代码块的CPU时间确实比第二个高,但是相对应的heap size却小一点。

第二个代码块尽管CPU时间节省了下来,但是因为声明了 map变量, heap size相应的变多了。

当你在CPU慢慢降下来偷偷窃喜时,也要关注其他的点,因为他们可能在你不注意的时候慢慢的长高了。

salesforce针对apex有好几个government limitation,我们在写代码的时候要从多个角度考虑,好多的点可能是互斥的,我们需要权衡好我们现在要在意什么,可以舍弃什么。空间换时间?时间换空间?没有最好的统一的解决方案,只有最适合你的当前业务场景的某个transcation代码。

总结:篇中根据最上面提供的官方文档进行一下简单的CPU limitation的描述。篇中有错误欢迎指出,有不懂欢迎留言。

salesforce零基础学习(一百零二)Limitation篇之 CPU Limit的更多相关文章

  1. 零基础学习Linux(二)网页乱码问题

    上次的博文零基础学习Linux(一)环境搭建中我们已经将Linux环境搭建完毕了,接下来我们就可以进行相关的操作了,在进行操作之前,我们先来看一下大家可能遇到的中文网页乱码问题. 1.问题演示 a)输 ...

  2. 零基础学习openstack【完整中级篇】及openstack资源汇总

    1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...

  3. Python零基础学习系列之二--Python介绍及环境搭建

    1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像P ...

  4. salesforce零基础学习(九十二)使用Ant Migration Tool 实现Metadata迁移

    我们在做项目时经常会使用changeset作为部署工具,但是某些场景使用changeset会比较难操作,比如当我们在sandbox将apex class更改名字想要部署到生产的org或者其他环境的or ...

  5. 零基础学习JavaSE(二)——基础语法

    二.Java 基础语法 2.1 Java 基础语法 java是一个面向对象的程序语言,及可把一切事物当做对象处理,而java的事物中最小的就是class (类),类中有方法,类可以创建对象,并且有一些 ...

  6. Spark (Python版) 零基础学习笔记(二)—— Spark Transformations总结及举例

    1. map(func) 将func函数作用到数据集的每个元素,生成一个新的分布式的数据集并返回 >>> a = sc.parallelize(('a', 'b', 'c')) &g ...

  7. MVC+Ext.net零基础学习记录(二)

    很多人在开发一个新的项目时,需要先决定项目的整体架构,是决定使用MVC的同时也不例外,具体包含:项目的多语言性,项目的多风格选择,项目的可扩展性 其中项目的多语言性:http://www.cnblog ...

  8. 跟我从零基础学习Unity3D开发--资源打包篇(AssetBundle)

    好久没更新了,一直在加班敢项目进度.这里和关注我的博客的童鞋表示一下歉意!这里有我录的Unity3D从零开始的视频教程大家可以关注一下:http://www.imooc.com/view/555  视 ...

  9. 零基础学习 Python 之数字与运算

    写在之前 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的 Python 写起,然后再慢慢涉及到高阶以及具体应用方面.我是完全自学的 Python,所以很是明白自学对于一个人的考验, ...

随机推荐

  1. SVG path d Attribute

    Scalable Vector Graphics (SVG) 1.1 (Second Edition) W3C Recommendation 16 August 2011 http://www.w3. ...

  2. Angular 2 for 2017 web full stack development

    1 1 1 Angular 2 for 2017 web full stack development 1 1 https://angular2.xgqfrms.xyz/ https://ng2-he ...

  3. CSS style color all in one

    CSS style color all in one https://developer.mozilla.org/en-US/docs/Web/CSS/color_value /* Hexadecim ...

  4. js console.log color all in one

    js console.log color all in one console.log color Chrome console.log 语法 / grammar %c, %s, css style ...

  5. macOS & timer & stop watch

    macOS & timer & stop watch https://matthewpalmer.net/blog/2018/09/28/top-free-countdown-time ...

  6. 什么是USDN稳定币?USDN的应用价值是什么?

    9月22日,美国货币监理署(OCC)发布了一项稳定币指南,主要内容围绕的是稳定币的监管及相关规定.一时间,稳定币得到了市场上广泛的关注.那么,什么是稳定币呢?什么又是USDN稳定币呢? 1.什么是稳定 ...

  7. MySQL切换版本踩坑记录(包括恢复数据方法)

    踩坑起因:在创建数据库时, 字段:create_time datetime DEFAULT CURRENT_TIMESTAMP, 报异常--Error Code: 1067 - Invalid def ...

  8. django中间件介绍

    在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...

  9. 02.Fancy Indexing

    import numpy as np x = np.arange(16) index = [3,5,8] x[index] array([3, 5, 8]) X = x.reshape(4,-1) X ...

  10. 【HTB系列】靶机Vault的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Kali: 10.10.14.213 靶机地址:10.10.10.109 先用nmap探 ...