Salesforce 超大量数据导入优化策略
超大量数据导入优化策略
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有可能会执行相当多的计算量来检查各条数据记录的权限。
举个例子:
某条Account记录拥有100个Contact记录,Account记录的所有者不是用户A,而所有Contact记录的所有者都是A,那么A自动获得了该Account记录的权限。
当A将某条Contact记录的所有者改为用户B时,B同时得到了该Contact记录和Account记录的权限,而A则失去了该Contact记录的权限。
与此同时,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 超大量数据导入优化策略的更多相关文章
- 从hbase读取数据优化策略和实验对照结果
起因:工作须要.我须要每5分钟从hbase中.导出一部分数据,然后导入到ES中.可是在開始阶段编写的python脚本,我发现从hbase读取数据的速度较慢,耗费大量的时间.影响整个导数过程,恐怕无法在 ...
- Redis数据导入工具优化过程总结
Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...
- mysql数据导入导出与数据表优化
一.数据导入 mysqlimport -uroot oa d:/aa.txt --fields-terminated-by=, --fields-optionally-enclosed-by= --l ...
- 10w行级别数据的Excel导入优化记录
需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取.校对.转换之后产生欠费数据.票据.票据详情并存储 ...
- Python 爬取 热词并进行分类数据分析-[云图制作+数据导入]
日期:2020.01.28 博客期:136 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入](本期博客) ...
- PHP中的数据库一、MySQL优化策略综述
前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...
- 【转载】HBase 数据库检索性能优化策略
转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...
- HBase 数据库检索性能优化策略--转
https://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的 ...
- 工作随笔—Elasticsearch大量数据提交优化
问题:当有大量数据提交到Elasticsearch时,怎么优化处理效率? 回答: 批量提交 当有大量数据提交的时候,建议采用批量提交. 比如在做 ELK 过程中 ,Logstash indexer 提 ...
随机推荐
- 1.9 From Native to HTML5
The mobile technology has become more and more mature, and it has evolved from a ridiculous situatio ...
- Http 1.x弊端与Http 2.0比较
HTTP2.0作为新版协议,改动细节必然很多,不过对应用开发者和服务提供商来说,影响较大的就几点. 新的二进制格式(Binary Format) http1.x诞生的时候是明文协议,其格式由三部分组成 ...
- [Swift]LeetCode889. 根据前序和后序遍历构造二叉树 | Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- Java常用工具类练习题
1.请根据控制台输入的特定日期格式拆分日期 如:请输入一个日期(格式如:**月**日****年) 经过处理得到:****年**月**日 提示:使用String的方法indexOf.lastIndexO ...
- linux清空文件内容的几种方式与区别
虽然linux清空文件内容的方式有很多种,但是他们之间有着细微的差别.通过实践我将他们分为两类: 将文件清空,文件大小为0k $ : > filename $ > filename $ ...
- 解决Eclipse中无法查看Java源码
1.点 "window"-> "Preferences"-> "Java" -> "Installed JRES ...
- Python内置函数(24)——frozenset
英文文档: class frozenset([iterable]) Return a new frozenset object, optionally with elements taken from ...
- tensorflow 1.0 学习:十图详解tensorflow数据读取机制
本文转自:https://zhuanlan.zhihu.com/p/27238630 在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找 ...
- JVM基础系列第9讲:JVM垃圾回收器
前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收 ...
- 【朝花夕拾】Android性能篇之(三)Java内存回收
在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...