本篇参考:

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. model基础操作

    url.py from django.contrib import admin from django.urls import path,include from app1.views import ...

  2. 【2020.12.02提高组模拟】A组反思

    55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...

  3. 20190713_(转)IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法 (转)

    此文为转载; 原文链接地址: https://www.cnblogs.com/mrma/p/3529859.html ----------------------------------------- ...

  4. 解决 win7 win10 等 64位 支持access数据库问题

    好多年不写ASP+ACCESS了,这两天帮朋友做个网站,碰到这个问题: ADODB.Connection 错误 '800a0e78' 对象关闭时,不允许操作. 记录一下. 以下内容转载自:https: ...

  5. DDD(领域驱动设计)--战术设计

    前言 战术设计 战略设计为我们提供一种高层视野来审视我们的软件系统,主要包括领域/子域.通用语言.限界上下文和架构风格等概念, 而战术设计则将战略设计进行具体化和细节化,它主要关注的是技术层面的实施, ...

  6. Qt模型视图结构遇见的小问题

    在本文的最开始,我们来看两个帮助文档内容: selectionMode : SelectionMode This property holds which selection mode the vie ...

  7. 自动化运维工具之Puppet master/agent模型、站点清单和puppet多环境设定

    前文我们了解了puppe中模块的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14086315.html:今天我来了解下puppet的master/age ...

  8. msfvenom命令自动补全工具下载=>msfvenom-zsh-completion

    msfvenom参数和命令很多,各种payload和encoder经常让⼈眼花缭乱,特别是对英语不好的⼈来说有些命令可能很容易忘记. 所以 Green_m 开发了⼀个zsh插件,可以⾃动化的补全msf ...

  9. 团队作业part2--需求规格说明书

    需求规格说明书 一.目的 本说明书为了让用户尽快了解产品所含功能,描述用户对产品的期望与需求.明确软件开发的最终目的,使开发出来的软件能够更好的达到用户的需求.其作为用户和软件开发人员达成的技术协议书 ...

  10. js实现跳转的几种方式

    1. window.open("url"); 2.用自定义函数 <script> function openWin(tag,obj) { obj.target=&quo ...