本篇参考:

https://developer.salesforce.com/docs/atlas.en-us.224.0.bigobjects.meta/bigobjects/async_query_overview.htm

https://trailhead.salesforce.com/content/learn/modules/big_objects

https://developer.salesforce.com/docs/atlas.en-us.salesforce_large_data_volumes_bp.meta/salesforce_large_data_volumes_bp/ldv_deployments_infrastructure_indexes.htm

我们在salesforce学习工作中,接触到很多的 标准的 object ,自定义 object 以及外部object。我们使用SOQL / SOSL 进行搜索,熟知他们的各种limitation,查询50000,DML 10000等等。
当数据量很多时,salesforce推荐我们where查询时要适当使用索引字段增快查询效率。我们做自定义开发开始效率都很好,随着数据越来越多,performance问题可能慢慢的出来。所以设计表的时候,表潜在的数据量可能会达到多少也是一个很重要的思考。
salesforce有一个 Big Object的概念,针对特别庞大的数据,可以使用 Big Object进行存储。所以问题来了?多少数据量算是庞大?

十万? 百万? 千万? 再往上好像很难在想象。不过在实际的一些特殊的业务场景这些数据量可能是远远不够的。举个例子,金融 / 保险等对钱敏感企业,可能会关心每一步的履历操作,针对每一步都需要记录,后期便于审计和追踪。这种数据通常会达到数以亿计。在salesforce中,Big Object 为十亿或更多记录提供一样的性能,并且可以通过一组标准api访问org或外部系统。也就是说如果潜在数据量可能达到10亿及以上,推荐使用 Big Object。

一. 应用场景与Big Object创建

在Salesforce中通常会有以下几种场景可能用到Big Object:

Customer 360:您有很多想要存储的客户信息。从忠诚度计划到交易、订单和账单信息,使用一个Big Object来跟踪每一个细节。
审计和追踪:salesforce提供了 field tracking的功能,每个表最多可以20个字段进行tracking,保留最多18个月,如果标准的满足不了审计和追踪的需要,可以考虑使用 big object实现。
历史归档:需要保持对历史数据的访问,以便进行大数据分析等目的情况下,可以考虑使用Big Object。

一. Big Object创建

1. Setup 搜索 big objects 以后选择Big Objects既可以查看当前的所有的 Big Objects,我们点击 new就可以新建一个 Big Object.
下图中是我们创建的一个 big object。可以看到目前的状态是 In Development,只有存在自定义索引字段才可以变成 development。

接下来我们按照要求创建一些自定义的字段,因为需要索引字段,索引字段前提是自定义字段要求勾选 required,所以真实的项目需要设计好哪些字段必填,哪些字段需要成为索引字段,一旦设计完索引字段便无法进行修改,想要修改只能重新创建 big object. 当我们创建完自定义字段以后创建自定义索引,索引最多只允许5个自定义的字段,最少也需要1个。

创建完字段接下来我们就需要编辑当前的 big object,将 object的 deployment status修改成 Deployed,则 一个Big Object创建完成。 

这里创建和普通的 object创建还是有一些区别的:

1. 后缀不同,普通的是 __c, big object是 __b.
2. 可选择的字段类型不同。 big object所能选择的类型更少,只可以选择 Lookup, Date/time, Email, Number, Phone, Text, TextArea(Long),URL.

二. 数据创建删除和查询

在聊如何创建和查询数据以前,先聊一下上面提到的序列 index。 我们以前学习SQL server等关系型数据库时,也接触过序列的概念。一言以蔽之:索引是对数据库表中一个或多个列的值进行排序的结构。索引是经过某种算法优化的,所以在针对某个索引字段查询时,查询次数会少很多,查询性能自然得到提升,我们可以将数据库索引好比是一本书前面的目录,能加快数据库的查询速度。salesforce object很多标准字段带了索引,可以查看上面的链接进行详细查看。

数据库索引有三种类型: 唯一索引 / 主键索引 / 聚集索引。 salesforce big object 应该是基于唯一索引来实现的。唯一索引是不允许其中任何两行具有相同索引值的索引。根据上面的表结构,索引使用 Rider_Account__c 以及 Start_Time__c 两个值共同作用,所以当有两条记录的这两个值均相同情况下,数据库只会创建一条数据。

big object可以通过 bulk api以及apex来创建, bulk api也是一个很大的章节,这里不做讲解,后期争取单独讲一下,这里的创建使用apex方式来进行。

apex通过 insertImmediate方法去插入数据,如果索引对应的字段值都是相同的,则只会生成一条数据,后面的会覆盖前面的值。

Datetime now = System.now();
List<Rider_History__b> riderHistoryList = new List<Rider_History__b>();
Rider_History__b riderHistory1 = new Rider_History__b();
riderHistory1.Start_Time__c = now;
riderHistory1.Rider_Account__c = 'test';
riderHistory1.Rider_Rating__c = 12.1;
riderHistory1.Service_Type__c = 'test';
riderHistory1.Start_Location_Latitude__c = 12.123;
riderHistory1.Start_Location_Longitude__c = 123.12;
riderHistoryList.add(riderHistory1);
Rider_History__b riderHistory2 = new Rider_History__b();
riderHistory2.Start_Time__c = now;
riderHistory2.Rider_Account__c = 'test';
riderHistory2.Rider_Rating__c = 13.2;
riderHistory2.Service_Type__c = 'test';
riderHistory2.Start_Location_Latitude__c = 12.123;
riderHistory2.Start_Location_Longitude__c = 123.12;
riderHistoryList.add(riderHistory2);
Database.insertImmediate(riderHistoryList);

可以查看到数据库的内容如下

删除时使用 deleteImmediate方法。

List<Rider_History__b> historyList = [SELECT Id,Rider_Account__c,Start_Time__c from Rider_History__b WHERE Rider_Account__c = 'test' ];
Database.deleteImmediate(historyList);

展示结果:

说完创建和删除接下来说查询。big object支持两种查询,同步 SOQL以及异步的SOQL。

如果 可以确定查询出来的数据量少想要在 apex中使用,我们可以使用SOQL进行查询,但是不是所有的SOQL语法可以使用。如果想要使用这种同步的SOQL,有以下的限制:

  • 当构建 序列的query时, query的第一个字段和最后一个字段间不要有空隙;
  • !=, LIKE, NOT IN, EXCLUDES, and INCLUDES 不支持;
  • 聚合函数不支持;
  • 不要使用Id字段进行查询;
  • 查询时必须包括索引字段,非索引字段不能作为where后查询的条件。

部分截图

异步SOQL以及在report / dashboard使用自行查看上方文档。

三. Big Object 限制

由于大对象的运行规模很大,它们不能完全像非大对象那样工作。使用大对象时,请记住以下几点。

大对象仅支持对象和字段权限。
部署大对象后,您将无法编辑或删除索引。要更改索引,请从一个新的大对象开始。
SOQL关系查询基于从选择字段列表中的大对象到标准或自定义对象的查找字段(不在过滤器或子查询中)。
大对象支持自定义Salesforce Lightning和Visualforce组件,而不支持标准UI元素(主页,详细信息页面,列表视图等)。
每个组织最多可以创建100个大对象。大对象字段的限制类似于自定义对象的限制,并取决于您单位的许可类型。
大对象不支持包含大对象,标准对象和自定义对象的交易。
为了支持大对象中的数据规模,您不能使用触发器,流程,流程和Salesforce应用。

总结:篇中简单描述 big object的使用,详情自行查看官方文档。篇中有错误欢迎指出,有不懂欢迎留言。

salesforce零基础学习(九十七)Big Object的更多相关文章

  1. 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  2. salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  3. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  4. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  5. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  6. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  7. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  8. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  9. salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.234.0.apexref.meta/apexref/apex_methods_syst ...

  10. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

随机推荐

  1. 如何在项目中使用composer的相关功能

    最近要在公司的magento项目中引用第三方库,用了composer来进行管理,composer还是非常方便的: 1.在应用的根目录下添加文件:composer.json {    "nam ...

  2. JVM学习(四)JVM调优

    一.调优命令 Sun JDK监控和故障处理命令有jps.jstat.jmap.jhat.jstack.jinfo jps,JVM Process Status Tool,显示指定系统内所有的HotSp ...

  3. Redis常见的八道面试题

      一.memcached与redis的区别? 1.存储方式不同.memcached把数据全部存在内存之中,断电之后会挂掉,而redis虽然也用到了内存,但是会有部分数据存在硬盘中,保证数据持久性. ...

  4. 几个超级好用但很少有人知道的 webstorm技巧

    我总结一些我发现的比较实用的功能,内容来自日常工作中用到的功能.图片来自PPT,是在公司内部的分享. 你不知道的webstorm进阶使用技巧 1.双击shift 全局搜索,可以搜索代码.设置等. 如果 ...

  5. 【Processing-日常1】小圆碰撞

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79741637

  6. vue项目中视频播放结束返回首页出现1秒左右的白屏问题

    vue项目的性能优化问题,一直以来都是大家比较关注的. 近日负责的项目中,使用了SignalR实时通讯,客户端中点击发起播放视频的请求到服务器,服务器接到请求后再调用前端的播放视频方法,以此来达到播放 ...

  7. Electron安装过程深入解析(读完此文解决Electron应用无法启动,无法打包的问题)

    1. 安装Electron依赖包 开发者往往通过npm install(或 yarn add)指令完成为Node.js工程安装依赖包的工作, 安装Electron也不例外,下面是npm和yarn的安装 ...

  8. mysql-2-where

    #进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件 分类: 1.按条件表达式筛选:> < = != <> >= <= 2 ...

  9. VID和PID

    今天很在一份datasheet上突然看到 VID 和 PID 很奇怪!!还不是很懂!!! 参考:https://blog.csdn.net/gaojinshan/article/details/787 ...

  10. P3431 [POI2005]AUT-The Bus

    Link 简化题意: 给你一张网格图,每个点有其对应的权值,让你找出来一条横纵坐标都单调不降的路径,并最大化经过点的权值. 分析: 这是经典的二维数点或者二维偏序问题. 如果两维一直在变的话,我们不是 ...