本文参考自以下系列文章:
1
2
3
4
5
6

超大量数据导入优化策略

Salesforce和很多其他系统都可以很好的协作。在协作过程中,数据的导入导出便成为了一个关键的步骤。

当客户的业务量非常大的时候,会有将超大量数据导入Salesforce的需求。对于超大量数据的导入,必须做好万全的准备,才能保证导入过程的顺利与高效。

对于超大量数据导入过程,可以从多个方面进行优化。它们也适用于Salesforce的其他功能。

精简表

有些时候,业务中涉及到大量、复杂的关系。在Salesforce中设计对应的对象时,可能会出现很多对象,它们互相之间存在复杂的联系。在进行查询的时候,Salesforce内部会将存储这些对象和关系的数据表进行联合(JOIN)操作,从而会消耗很多系统资源。

采用“精简表”(Skinny Table)可以对这种情况进行优化。精简表从若干数据表中提取相关字段,集中保存起来,使得Salesforce在进行查询时不需要进行多表的联合,而是直接从精简表中查询,提高了效率。

比如:在Salesforce中对象的标准字段和自定义字段是分开存放的。对于Account对象,有表A(存储了标准字段)和表B(存储了自定义字段)。当用户对Account对象进行查询时,系统会将表A和表B进行联合,给出查询结果。为了避免联合操作,可以建立一个精简表C,其中同时存放了来自表A和表B的字段,它们都是用户需要经常使用和查询的。那么在用户对Account对象进行查询时,Salesforce直接对表C进行查询即可。

要注意的是,每一张精简表中的各个字段只能属于同一个对象,并且只能通过Salesforce的客服进行申请创建。

字段索引

为了优化各种查询语句,Salesforce内部使用了查询优化器。查询优化器中包括的最重要一点就是字段索引。在Salesforce中对很多字段都可以设置索引,或者自动被索引,比如Id、Name、CreatedById、CreatedDate,还有被设置为“唯一”(Unique)或“外部ID”(External ID)的字段。

在使用Salesforce的SOQL语言进行查询时,在WHERE部分尽量使用索引的字段,可以极大的提高查询效率。

有些字段的索引必须通过Salesforce的客服来启用。

记录所有者优化

Salesforce规定每条记录必须有所有者(Owner)。与此同时,Salesforce中对于数据记录的权限有着复杂的设定。每当数据记录的所有者的权限发生变化时,Salesforce会自动计算其所拥有的所有记录的权限。

在超大量数据的导入过程中,会产生很多数据,它们都需要被分配所有者。如果将大量记录统一分配到同一个用户作为所有者,而该用户在今后被更改了角色设定,那么所有属于该用户的记录都会被重新计算权限。记录的数量越大,计算所需的系统资源就会越大。

为了避免这种情况的发生,在进行导入数据的时候,需要尽量避免让同一个用户拥有过多的记录(10000条以内)。

如果某个用户必须成为很多记录的所有者,则尽量将此用户的角色定位为角色结构的顶端,并且尽量不要更改该用户的角色,这样可以避免非常多的权限重新计算。其他用户可以通过其他的共享设定来读取该用户拥有的数据记录。

对象的关系优化

Salesforce中可以对对象之间进行各种关系的定义,比如Lookup类型、Master-Detail类型等。当用户对于某条记录拥有权限,那么该用户对于此条记录的相关父记录也拥有权限。这些计算是Salesforce自动完成的。当某条数据记录拥有过多数量的相关子数据记录,而某条子记录被修改的时候,Salesforce有可能会执行相当多的计算量来检查各条数据记录的权限。

举个例子:

  1. 某条Account记录拥有100个Contact记录,Account记录的所有者不是用户A,而所有Contact记录的所有者都是A,那么A自动获得了该Account记录的权限。

  2. 当A将某条Contact记录的所有者改为用户B时,B同时得到了该Contact记录和Account记录的权限,而A则失去了该Contact记录的权限。

  3. 与此同时,Salesforce为了检查A是否还拥有Account记录的权限,会检查所有其他的99条Contact记录,只有当A失去了所有的Contact记录的权限后,A才会失去Account记录的权限。

从这个例子可以看出,当某条记录包含了太多的子记录时,更改某个子记录的权限会导致Salesforce对所有其他的记录进行一一检查,会耗费相当多的系统资源。

要解决这个问题,就要尽量避免某条父记录下拥有过多(10000条以上)的子记录。

精简对象相关设定

Salesforce中对于对象的共享权限、关系等设定有很多种。在进行数据导入时,Salesforce会根据这些设定对数据进行检测。当这些检测的数量过多的时候,会消耗相当多的系统资源。从以下几个方面可以进行优化:

  • 组织默认共享权限(Organization-wide sharing defaults):当导入了一条记录时,如果该记录所属的对象有着默认的公开读写权限(Public Read/Write),那么系统会跳过对其权限的计算,减少了系统资源的使用。
  • 对象关系:如果某对象和其他对象有着过多的“父-子”关系,那么当导入属于该对象的一条记录时,其相关的各种子记录的权限都会被检查。所以减少对象之间复杂的关系可以减少多余的检查,减少了系统资源的使用。
  • 共享规则(Sharing rule):如果某对象被设定了很多的共享规则,在导入该对象的数据记录时,Salesforce会根据这些共享规则对其进行各种权限的检查,会消耗很多系统资源。
  • 验证规则(Validation rule),触发器(trigger),工作流规则(Workflow rule):这些设定都会在数据导入时执行。当某对象拥有过多的这些设定,它们的执行会消耗非常多的系统资源。

数据导入的最佳实践

在导入数据前:

  • 启用并行权限计算(parallel recalculation)和延迟共享计算(defer sharing calculation)功能:进行大量数据导入会导致非常长的共享规则计算。要避免这些问题,可以在数据导入的过程中将这些计算所消耗的系统资源减少。
  • 建立角色结构定义
  • 在导入数据之前导入用户。
  • 尽可能的将对象的组织默认共享权限(Organization-wide sharing defaults)设定为公开读写权限(Public Read/Write),从而让系统跳过对这些对象的记录的权限计算。
  • 让数据尽可能的“干净”,尤其是各种外键关系。如果有破坏了这些关系的数据存在,会在导入过程中跳出错误,延长导入的时间。
  • 尽可能的停用数据相关的设定,比如验证规则(Validation rule),触发器(trigger),工作流规则(Workflow rule)。

在导入数据时:

  • 如果对象之间有“父-子”关系,确保首先导入父对象,在导入子对象,确保导入的数据是“干净”的,不会出错的。
  • 尽量使用insert和update的方式进行导入,而非upsert方式,因为后者需要更多的时间来完成操作。
  • 当使用update方式进行数据导入,让导入的数据只包含更新的字段,而非对象的所有字段。
  • Salesforce在更新子记录时,其所属的父记录会被锁定,直到子记录更新完成。在导入子记录时,尽量将从属于同一条父记录的子记录分成一组,从而在导入的过程中同一条父记录不会被不同的线程锁定。

Salesforce 超大量数据导入优化策略的更多相关文章

  1. 从hbase读取数据优化策略和实验对照结果

    起因:工作须要.我须要每5分钟从hbase中.导出一部分数据,然后导入到ES中.可是在開始阶段编写的python脚本,我发现从hbase读取数据的速度较慢,耗费大量的时间.影响整个导数过程,恐怕无法在 ...

  2. Redis数据导入工具优化过程总结

    Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...

  3. mysql数据导入导出与数据表优化

    一.数据导入 mysqlimport -uroot oa d:/aa.txt --fields-terminated-by=, --fields-optionally-enclosed-by= --l ...

  4. 10w行级别数据的Excel导入优化记录

    需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取.校对.转换之后产生欠费数据.票据.票据详情并存储 ...

  5. Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]

    日期:2020.01.28 博客期:136 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入](本期博客) ...

  6. PHP中的数据库一、MySQL优化策略综述

    前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...

  7. 【转载】HBase 数据库检索性能优化策略

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...

  8. HBase 数据库检索性能优化策略--转

    https://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的 ...

  9. 工作随笔—Elasticsearch大量数据提交优化

    问题:当有大量数据提交到Elasticsearch时,怎么优化处理效率? 回答: 批量提交 当有大量数据提交的时候,建议采用批量提交. 比如在做 ELK 过程中 ,Logstash indexer 提 ...

随机推荐

  1. Python爬虫6-利用ProxyHandler设置代理服务器

    GitHub代码练习地址:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac09_ProxyHandler.pyProxyH ...

  2. 记录一次JavaWeb开发的乱码解决

    POST提交的中文,测试能正确接收到,而且在控制台打印出中文 但是存到数据库乱码 查看了数据库,设置的是utf-8,最后发现应该在数据库连接的地方设置: jdbc:mysql://localhost: ...

  3. [Swift]LeetCode925. 长按键入 | Long Pressed Name

    Your friend is typing his name into a keyboard.  Sometimes, when typing a character c, the key might ...

  4. Kubernetes系列之监控Metres-server实战篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics AP ...

  5. PyCharm证书过期:Your license has expired

    报错“your evaluation license has expired, pycharm will now exit”1.解决步骤,点击‘Activation code’,授权激活pycharm ...

  6. Jquery.ajax dataType参数

    dataType 类型:String 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 ...

  7. C++11 实现生产者消费者模式

    代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...

  8. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  9. sql server 性能调优之 SQL语句阻塞查询

    在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后.就需要检查数据库是否有出现阻塞 当时数据库的生产环境中主表数据量超过2000w, ...

  10. Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...