本文参考自官方文档。原文链接

大量数据部署对Salesforce的影响

当用户需要在Salesforce中部署大量数据的时候,部署的过程往往会变慢。这时就需要架构师或开发者设计出更好的过程来提高大量数据的部署效率。

多租户架构和元数据

Salesforce使用元数据驱动机制来实现多租户架构。

不同于传统的关系数据库,Salesforce中对每个“租户”系统内部的数据结构并没有相对应的数据表。Salesforce中使用统一的数据结构来保存各个“租户”系统内部数据结构的定义,这就是元数据。

Salesforce自己拥有一套通用的数据表,将所有“租户”系统中的对象、字段、索引、数据、关系等作为元数据分别保存到相应的表中。

在某“租户”系统运行时,Salesforce会从这套通用数据表中取出该“租户”系统拥有的对象、字段等,动态编译成一个虚拟的数据库,其中只包含该“租户”系统中的数据和结构。

通过这样的机制,Salesforce可以高效的保存多租户的内容(只使用一套数据结构),让各个“租户”的内容保持相互独立,互不影响,易于修改(动态编译数据结构)。

搜索机制

Salesforce中所有可搜索的数据都必须拥有索引。

在一条数据被创建之后,系统会自动将其中可以被搜索的内容(比如各种字符串数据)进行归类索引。这个过程需要花费一定的时间,所以在记录被创建以后可能无法马上被搜索到。最长的等待时间可以达到15分钟。

在执行搜索时,Salesforce会首先对这些索引进行搜索,然后使用诸如用户权限、搜索数量限制等条件对于搜索结果进行过滤,创建一个结果集(result set)。结果集中保存的是最符合搜索条件的数据。最后Salesforce将结果集中对应的数据在数据库中进行查询,从而返回用户需要的字段等信息。

大量数据相关机制和最佳实践

Salesforce中针对大量数据处理设计了不同的机制来提高效率。

Force.com查询优化器(Force.com Query Optimizer)

查询优化器是Salesforce内置的工具,对于报表、列表视图、SOQL查询语句、搜索操作进行优化,计算出最优的搜索方式。

它会遵循以下几点进行优化:

  1. 寻找最符合查询语句的索引。如果查询语句中拥有过滤条件,则过滤条件优先被考虑作为查询的索引。
  2. 寻找最符合的数据表。
  3. 对被查询的数据表进行排序,使得查询的开销尽可能小。
  4. 引用外键定义来创建最有效的联合(JOIN)操作。
  5. 更新数据库统计数据。

数据库统计数据(Database Statistics)

数据库统计数据是对于数据库中数据的统计。基于数据的种类、数量,查询操作可以选择出最有效率的进行方式。

SOQL 和 SOSL 对比

SOQL 是类似于 SQL 的查询语句,而 SOSL 是全文检索查询。

当我们确定被查询的文本存在于某个字段中,使用 SOSL 的速度要优于 SOQL。

与此同时,在一个 Apex 事务(Transaction)的执行中,SOSL 查询的记录上限是2000,而 SOQL 是50000。

批量查询方法

使用 Batch Apex 可以查询高达50,000,000条记录,但是它并不一定适合所有的情景。

使用 Bulk API 可以查询多达 15GB 的数据,它们会保存在15个 1GB 的文件中。

Bulk API 的查询超时时限是2分钟。如果成功进行了查询,但是在返回结果的过程中用时超过10分钟,或者数据文件大小超过了 1GB,那么 Salesforce 会将当前的结果缓存起来,然后重试。当失败15次以后,才会返回错误信息。

主键分块(PK Chunking)查询

主键分块查询是 Bulk API 提供的一个选项。

对于千万级的数据,普通的查询优化可能已经没法将查询结果限制在一定的数量范围。这时,使用主键分块会优化查询。

每条数据都有主键,也就是ID,在整个系统中是唯一的值,也是索引字段。

使用主键分块查询,系统会自动将数据依据主键的值分块,每块包含的数据量默认是10万条。用户可以设置每块的数据量,最大不超过25万条。在分块之后,系统会对每块进行分别查询,从而将本来很大的数据表分解成无数的小块,同时进行查询,提高了效率。

精简数据表(Skinny Tables)

Salesforce中将所有对象的标准字段和自定义字段分别存储于两张表中。在对这些对象进行查询操作的时候,就必须对这两张表进行联合(JOIN)操作。而联合操作会提高查询的开销。为了提高这些效率,Salesforce引入了精简数据表机制。

精简数据表是一个单独的表,其中存储着若干标准或自定义字段的值,但并不包括被“软删除”的那些。精简数据表相当于存储了已经进行了联合操作的字段和内容,从而可以更有效率地支持前台的查询。

精简数据表的一些特性:

  • 一个精简数据表最多可以包含100个字段(列)。
  • 每一个精简数据表都对应一个对象,所以其包含的字段必须属于此对象,不能有其他对象的字段。与此同时,也不能有公式(formula)字段和查找(look up)字段。
  • 精简数据表会被拷贝到完整沙盒(Full sandbox)中,但不会被拷贝到其他类型的沙盒中。如果想要拷贝到其他类型的沙盒,必须通过Salesforce的客户支持帮助。
  • 精简数据表必须要通过Salesforce的客户支持来启用。

索引字段

索引字段最多的被用于数据库的查询语句。Force.com的查询优化器对于标准和自定义的索引字段有着不同的规定。

  • 对于标准索引字段,查询结果必须在前100万条记录中有少于30%的符合率,并且在余下最多100万条记录中有少于15%的符合率。否则该索引不会被查询语句所使用。
  • 对于自定义索引字段,查询结果必须在所有记录中有少于10%的符合率,查询结果最多为333333条记录。否则该索引不会被查询语句所使用。

与此同时,Force.com的查询优化器对WHERE语句中的AND、OR条件有着单独的规定。

  • 对于AND条件中使用的索引字段,其返回的查询结果必须少于总记录数的20%,并且不超过66666条。
  • 所有在OR条件中使用的字段必须是索引字段。对于这些索引字段,其返回的查询结果必须少于总记录数的10%,并且不超过333333条。

SOQL和SOSL语句中的null值

在查询语句中,要尽量避免在WHERE条件中判断null值。

比如下面的查询语句(伪代码):

SELECT Name FROM Account WHERE Account_ID__C = :acctid;

如果变量acctid为null,则整个Account表都会被搜索,严重降低了查询效率。

可以改写为:

if (acctid != null) {
SELECT Name FROM Account WHERE Account_ID__C = :acctid;
} else {
...
}

SOQL和SOSL语句中的公式字段

在查询语句中,要尽量避免在WHERE条件中以公式字段(Formula)作为过滤条件。

这么做的原因是公式字段的值总是在被引用的时候即时计算的,并且在不经过 Salesforce 客服的帮助下是不能做索引的。所以如果以公式字段作为过滤条件,查询的速度会非常慢。

查询的最佳实践原则

总结起来,进行数据查询的最佳实践原则有两条:

  1. 为查询语句增加过滤条件,从而使查询过程涉及的数据尽可能少
  2. 让系统内存在的有效数据尽可能少

Salesforce 大量数据部署的最佳实践的更多相关文章

  1. Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)

    Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 3. Nginx配置反向代理 3.1 cnetos 安装nginx 首先,我们需要在服务器上安装N ...

  2. Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一)

    环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输: xftp 1.在本地创建asp.net core应用发布 1.1 使用Vs2017 新建 ...

  3. Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践

    原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输 ...

  4. 【翻译】ScyllaDB数据建模的最佳实践

    文章翻译自Scylla官方文档:https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ 转载请注明出处:https: ...

  5. 掌握OpenStack部署的最佳实践 打破部署失败的魔咒

    部署OpenStack环境并不是一项简单的任务:根据SUSE最近的调查显示“曾经部署过OpenStack的企业当中有一半都失败了”.然而,随着最佳实践的出现,企业可以使用其避免在部署OpenStack ...

  6. Mongo实战之数据空洞的最佳实践

    问题背景: 某天,开发部的同事跑过来反映: mongodb数据文件太大,快把磁盘撑爆了!其中某个db占用最大(运营环境这个db的数据量其实很小) 分析: 开发环境有大量测试的增/删/改操作,而由于Mo ...

  7. Kafka数据迁移MaxCompute最佳实践

    摘要: 本文向您详细介绍如何使用DataWorks数据同步功能,将Kafka集群上的数据迁移到阿里云MaxCompute大数据计算服务. 前提条件 搭建Kafka集群 进行数据迁移前,您需要保证自己的 ...

  8. Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

    大家好!我是小富- 这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号.密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小. 说起这 ...

  9. Salesforce 超大量数据导入优化策略

    本文参考自以下系列文章: 1 2 3 4 5 6 超大量数据导入优化策略 Salesforce和很多其他系统都可以很好的协作.在协作过程中,数据的导入导出便成为了一个关键的步骤. 当客户的业务量非常大 ...

随机推荐

  1. C#8个常用的字符串的操作

    1.根据单个分隔字符用split截取 string st="GT123_1"; string[] sArray=st.split('_'); 输出:sArray[0]=" ...

  2. 远程桌面连接:出现身份验证错误,要求的函数不受支持,可能是由于CredSSP加密Oracle修正的解决方法

    在做app时需要连接服务器来进行数据交互,但是在阿里云页面里连接服务器太不好用,所以使用windows自带的远程连接来进行. 一.但是连接的过程中出现了以下问题: 二.最初是有点迷茫的,不知道从哪里下 ...

  3. python 安装 reportlab 报错 “ImportError: No module named reportlab.lib”

    reportlab是什么? 是一个处理PDF和画图的python开源库. 初次安装: pip install reportlab 重新安装: pip install --upgrade --force ...

  4. supervisor 启动dotnet.core 报“ too many start retries too quickly”

    环境: 操作系统:Centos 7 dotnet core:2.0.0    2.1.3 问题: 在使用supervisor 配置守护进程时,启动dotnet.core程序失败,查看/tmp下supe ...

  5. [Jenkins][git]构建时提示Caused by: hudson.plugins.git.GitException: Command "/usr/bin/git reset --hard" returned status code 128:

    --------------------- 如需转载,转载请注明出处. --------------------- 今日发现所有IOS构建相关的job全部失败,并提示如下错误: ERROR: Erro ...

  6. ⑦JSP2.0的福利(标签文件)

    前言 本篇接着上一篇博客:[传送门] 这次讲的是JSP2.0的特性之一,我们可以编写标签文件,指没有标签处理器和标签类库描述符的定制动作指令,不编译,无标签类描述符. 本文结构: ①标签文件简介 ②第 ...

  7. ①小姐,来桶全家桶不?(Servlet)

    一.前言 小生不才,大二下半学期第二个星期,近11月博客园.星期六闲来看看经典书.重温下Serlvet. 二.温故而知新:超文本转移协议HTTP HTTP协议是通过互联网(internet)或企业内部 ...

  8. 函数式编程之-F#类型系统

    在深入到函数式编程思想之前,了解函数式独有的类型是非常有必要的.函数式类型跟OO语言中的数据结构截然不同,这也导致使用函数式编程语言来解决问题的思路跟OO的思路有明显的区别. 什么是类型?类型在编程语 ...

  9. Perl的IO操作(2):更多文件句柄模式

    open函数除了> >> <这三种最基本的文件句柄模式,还支持更丰富的操作模式,例如管道.其实bash shell支持的重定向模式,perl都支持,即使是2>&1 ...

  10. spark之scala程序开发(集群运行模式):单词出现次数统计

    准备工作: 将运行Scala-Eclipse的机器节点(CloudDeskTop)内存调整至4G,因为需要在该节点上跑本地(local)Spark程序,本地Spark程序会启动Worker进程耗用大量 ...