本篇参考:

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. Integer中的奇妙位运算

    Integer中的奇妙位运算 参考资料 https://segmentfault.com/a/1190000015763941 highestOneBit(int i) 函数的作用是获得传入参数的最高 ...

  2. SpringBoot中的Tomcat是如何启动的?

    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>s ...

  3. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  4. centos7.5以上poenssl和openssh升级

    2020年12月09日,360CERT监测发现  openssl  发布了  openssl 拒绝服务漏洞  的风险通告,该漏洞编号为  CVE-2020-1971  ,漏洞等级:高危 ,漏洞评分:7 ...

  5. 七、git学习之——使用GitHub、自定义Git、

    原文来自 一.使用GitHub 我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人 ...

  6. MySQL的验证方式

    mysql8之后root用户的密码验证方式修改了,mysql8的加密方式为caching_sha2_passoword,而navicat连接所用的方式为native_password. 使用命令mys ...

  7. Java PDF全套笔记

    java 知识pdf文档,基本涵盖了java知识点 java基础部分:https://github.com/HOSystemH/JavaFile/tree/master/JavaPDF java高级部 ...

  8. MySQL03-多表&事务

    1.多表查询 1.1 笛卡尔积 有两个集合A,B .取这两个集合的所有组成情况. 要完成多表查询,需要消除无用的数据 1.2 多表查询分类 1.2.1 内连接查询: 1.隐式内连接:使用where条件 ...

  9. 使用脚手架搭建vue项目

    全局安装环境 安装webpack npm install webpack -g 安装vue脚手架 npm install -g @vue/cli-init 初始化vue项目 vue init webp ...

  10. get \post 接口代码及断言编写

    post 请求接口 import requests import json url_path = "http://www.baidu.com" data = {"user ...