本篇参考:

https://developer.salesforce.com/blogs/engineering/2013/04/managing-lookup-skew-to-avoid-record-lock-exceptions.html

https://developer.salesforce.com/blogs/engineering/2012/04/avoid-account-data-skew-for-peak-performance.html
https://developer.salesforce.com/blogs/engineering/2012/06/architect-salesforce-record-ownership-skew-for-peak-performance-in-large-data-volume-environments.html

性能以及稳定性对于一个系统来说是至关重要的。 今天说的是数据Lookup倾斜我们在一个系统中,表和表的关系不可能是完全独立的存在,有关系就要创建其关联, lookup也好, MD也好。有些表作为主数据,数据量可能很庞大,Lookup数据倾斜简单的定义可以理解为,当一条记录有10K条同个表记录进行关联情况下,便会很影响性能,变成一个沉默的杀手,看不出来程序配置哪里有问题,但是可能出现崩溃或者性能堪忧的风险。

举几个例子更好的去理解一下:
符合 Lookup Data Skew
1. 一条顾客数据,绑定了超过10000的案件数据;
2. 一个自定义表,绑定了超过10000条他的子表的数据;
不符合 Lookup Data Skew
1. 一个user,拥有10000条记录。(之所以不属于原因是 要求同一个表,如果一个 user拥有10000条顾客或者案件记录则符合)

lookup skew通常可以分成三个类型:

  • Account Data Skew:某些Salesforce对象,如Account和 Opportunity,在 sharing model 是private情况下,维护父子数据访问会有一个特殊的数据关系,如果同一个 account记录拥有太多的Opportunity记录,则容易产生 account data skew从而导致性能的风险;
  • Ownership Skew:当一个user针对同一个表拥有超过10K的数据,在管理 role hierarchy 和 sharing rule场景下就很容易造成 ownership的倾斜
  • Lookup Skew:当具有lookup关系的两个表,一个父表的数据如果关联了超过10K的这个子表的数据,则造成了 lookup skew。

上面的内容都是概念性描述,那么在我们实际场景中是否出现过因为lookup skew导致的问题呢,这样才能让我们能更好的知道为什么 lookup skew如此堪忧?

最常见的场景:unable_to_lock_row。根据salesforce 数据DML的原理,当一个子表进行DML(这里通常使用 insert / update)时,需要先锁定父表,然后进行子表的DML操作,当子表的记录操作完成,会解锁父表记录,然后下一条记录来了,锁定它这条记录的父表,然后进行相同的后续操作。
如果一个父表绑定了太多的同一个子表的数据,则容易造成 unable_to_lock_row的情况,这种事情偶发存在,可能重新执行就通过。客户出现这个问题,提case,作为开发人员修改也是很痛苦的事情。

针对这种情况如何去处理呢?大概有几种处理方式(不一定齐全,可以参看上方文档)

1. 针对 Account Data Skew尽量做到多建几个子 account,通过 parent account形成关联关系以后,将数据进行分发,从而减少每条account绑定的数量;

2. 针对 ownership skew,尽量做到user不存在 role或者在 role hierarchy最上层,这样在 role hierarchy变更情况下,不用有share的性能风险。

总结:Data Skew在设计上是一个很重要的一环,它会影响你的 sharing 性能以及系统稳定性。篇中只是简单介绍了概念以及常用情况的处理方式,具体的细节还请参看上方的文档。篇中有问题欢迎指出,有不懂欢迎留言。

salesforce零基础学习(九十九)Salesforce Data Skew(数据倾斜)的更多相关文章

  1. salesforce零基础学习(九十七)Big Object

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.224.0.bigobjects.meta/bigobjects/async_query ...

  2. salesforce零基础学习(九十三)Email To Case的简单实现

    Salesforce提供了标准的功能来实现通过Email 创建 Case.我们可以设置指定的路由的地址,指定条件的邮件会自动生成到目标salesforce系统的Case数据.Salesforce提供了 ...

  3. salesforce零基础学习(九十七)Event / Task 针对WhoId的浅谈

    我们在Sales Cloud中经常会创建顾客,如果针对TO C业务,会启用个人顾客,比如针对车企行业,有一些场景是需要卖给个人的,而不只是企业采购.当通过打电话或者其他的场景有潜在客户并且转换成客户以 ...

  4. salesforce零基础学习(九十一)Facet

    说Facet以前,我们先说一下浏览器加载解析以及渲染的过程.浏览器获取一个HTML的文件时,会按照自上向下的顺序进行解析,并在加载过程中进行渲染.对html解析成DOM树,对CSS 解析成CSS Ru ...

  5. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  6. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  7. salesforce零基础学习(九十六)Platform Event浅谈

    本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...

  8. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  9. salesforce零基础学习(一百一十)list button实现的一些有趣事情

    本篇参考: salesforce零基础学习(九十五)lightning out https://developer.salesforce.com/docs/component-library/docu ...

  10. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

随机推荐

  1. 如何自动化你的Excel导入导出(Java)?

    GitHub | 中文 | English | 博客 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择用Apache P ...

  2. PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 在<moviepy音视频剪辑:音视 ...

  3. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的dockWidgetArea和docked属性

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 dockWidgetArea和docked属性这两个属性在Design ...

  4. 第15.35节 PyQt编程实战:结合QDial实现的QStackedWidget堆叠窗口程序例子

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.案例说明 本案例是老猿在学习QStackedWidget中的一个测试案例,该案例使用QStack ...

  5. vue中两行代码实现全选及子选项全部选中,则全选按钮选中,反之有一个没选中,就取消选中全选按钮

    every() 方法使用指定函数检测数组中的所有元素: 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测. 如果所有元素都满足条件,则返回 true. 逻辑 ...

  6. 米酷CMS 7.0.4代码审计

    工具:seay源代码审计系统 源代码:网上很好找,这里就懒得贴上了,找不到的话可以给我留言 后面一段时间会深入学习安全开发,代码审计,内网渗透和免杀,快快成长. 审这个系统是因为在先知上看到一篇审它老 ...

  7. PHP代码审计分段讲解(9)

    22 弱类型整数大小比较绕过 <?php error_reporting(0); $flag = "flag{test}"; $temp = $_GET['password' ...

  8. 定位方式 及CSS高级技巧

    定位 background-position 背景位置 浮动,在一个浮字上面,我们的定位,在一个位上.CSS离不开定位,特别是后面的JS特效,天天和定位打交道. 为什么要使用定位? 元素的定位属性 元 ...

  9. 原创:DynamicDataDisplay波形显示自定义格式

    原创:DynamicDataDisplay 原版本在日期显示的格式上与我们的习惯不一样,特做如下修改: 自定义日期格式修改: //MainWindow.cs中 var ds = new Enumera ...

  10. 如何写好PPT,什么样的PPT容易被人理解记住

    PPT一般是用于讲解性的行为而存在,那如果写好PPT呢?如果写好,这个完全要取决于你所面向的目标读者,是用于学术行为呢?还是用于商业行为.面对不同的目标群体,有不同的策略.但是无论面向群体是谁我们都有 ...