学习目标
完成本单元后,您将能够:
- 使用标准SOQL查询大对象。
- 使用Async SOQL查询大对象。
- 列出使用Async SOQL而非标准SOQL的优缺点。
SOQL和异步SOQL
可以使用SOQL或Async SOQL查询大对象。异步SOQL使用SOQL命令的子集。它是从头开始设计的,用于处理可以保存在大对象中的大量数据。由于异步SOQL查询是异步运行的,因此您不必担心查询超时。异步SOQL查询在后台运行,可以在Salesforce实体数据,标准对象,自定义对象和大对象上运行。异步SOQL通过Chatter REST API实现。
通常,当您处理大量数据时,您希望使用Async SOQL而不是标准SOQL。如果您只需要来自大对象的小数据集,或者如果您需要立即获得结果,请使用标准SOQL。异步SOQL也适用于标准和非大型自定义对象,但对这些对象的支持处于试用阶段。
请记住,虽然每个许可证都包含自定义大对象,但Async SOQL仅包含额外大对象容量的许可。在以下时间使用标准SOQL:
- 您希望在UI中显示结果,而无需用户等待结果。
- 您希望立即返回结果以便在Apex代码块中进行操作。
- 您知道查询将返回少量数据。
在以下情况下使用Async SOQL:
- 您正在查询数百万条记录。
- 您希望确保查询完成。
- 您不需要在索引之外进行聚合查询或过滤。
简而言之,Async SOQL允许您在大对象中获取数百万条记录,并将相关数据提取到可管理的工作数据集中。
如何使用SOQL查询大对象
如果您已经熟悉使用SOQL,那么您会感到宾至如归。使用标准SOQL时需要注意的事项与使用SOQL和非大对象的大对象不同。对于具有大对象的SOQL查询,您必须从索引中定义的第一个字段开始构建查询,而不跳过查询中第一个和最后一个字段之间的任何字段。因此,例如,如果索引定义了三个字段,则无法仅使用第一个和第三个字段创建查询。
您可以使用这些比较运算符 =, <, >, <=, > =, 要么 在在查询的最后一个字段上。查询中的任何先前字段只能使用=运营商。该!=, 喜欢, 不在, 排除,和 INCLUDES 运算符在涉及大对象的任何查询中都无效。
以下查询假定您有一个大对象,其中索引由其定义 Account__c, Game_Platform__c,和 Play_Date__c。此查询指定索引中的所有三个字段。在这种情况下,过滤器Play_Date__c 可以是一个范围。
SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Game_Platform__c='PC' AND Play_Date__c=2017-09-06T00:00:00Z
查询不起作用,因为查询中的间隙在哪里 Game_Platform__c 应该。
SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Play_Date__c=2017-09-06T00:00:00Z
如何使用异步SOQL查询大对象
有两种主要方法可以使用Async SOQL从大对象中获取可管理的数据集。首先是使用过滤。您可以使用过滤将大对象数据的一小部分提取到自定义对象中。然后,您可以在报告,仪表板或其他漂亮的分析工具中使用它。
创建可管理数据集的另一种方法是通过粗略聚合。这些是Async SOQL支持的聚合函数:AVG( field ), COUNT( field ), COUNT_DISTINCT( field ), SUM( field ), MIN( field ), MAX( field )。这些聚合函数可以更好地控制从大对象中提取的数据。
形成您的查询
使用Async SOQL,我们查询自定义大对象 Customer_Interaction__b,并将结果指向我们的目标对象 TargetObject__c。我们将特定日期的帐户和游戏内购买信息从我们的自定义大对象提取到目标对象,然后我们可以将其用于报告和分析。必填字段
名称 | 类型 | 描述 |
---|---|---|
询问 | 字符串 | 指定要执行的SOQL查询的参数。 |
targetObject | 字符串 | 要插入查询结果的标准对象,自定义对象,外部对象或大对象。 |
targetFieldMap | Map <String,String> | 定义如何将查询结果中的字段映射到目标对象中的字段。定义时 targetFieldMap 参数,确保字段类型映射是一致的。如果源字段和目标字段不匹配,则适用这些注意事项。任何源字段都可以映射到目标文本字段。如果源和目标字段都是数字,则目标字段必须具有与源字段相同或更多的小数位数。如果不是,则请求失败。此行为是为了确保转换中不会丢失任何数据。如果查询结果中的字段被多次映射,即使映射到目标对象中的不同字段,也只使用最后一个映射。 |
示例URI
https://yourInstance.salesforce.com/services/data/v41.0/async-queries/
POST请求正文
{
"query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
"operation": "insert",
"targetObject": "Customer_Interaction_Analysis__c",
"targetFieldMap": {"Account__c":"Account__c",
"In_Game_Purchase__c":"Purchase__c"
},
"targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
"Copy fields from source to target":"BackgroundOperationDescription__c"
}
}
在此查询中,我们从特定日期2017-09-06获取客户交互大对象的帐户和游戏内购买信息,并将该数据发送到我们创建的自定义对象中, Customer_Interaction_Analysis__c。因为我们使用的是Async SOQL而不是标准的SOQL,所以我们可以过滤而不必担心包含其他索引字段。此新自定义对象将填充该日期的所有帐户和游戏内购买信息。从那里我们可以开始做一些分析,并试图找出为什么我们的游戏是如此惊人的成功。
POST响应机构响应正文包括查询 的jobId,查询的状态以及任何相关消息。
{
"jobId": "08PD000000003kiT",
"message": "",
"query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
"status": "New",
"targetObject": "Customer_Interaction_Analysis__c",
"targetFieldMap": {"Account__c":"Account__c",
"In_Game_Purchase__c":"Purchase__c"
},
"targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
"Copy fields from source to target":"BackgroundOperationDescription__c"
}
}
跟踪您的查询状态
要跟踪查询的状态,请指定它 JOBID使用HTTP GET请求。查询的状态在。中返回状态领域。如果你没有指定JOBID,我们返回所有查询的状态。该状态 可:
- 取消- 工作在被运行之前被取消了。
- 成功- 工作顺利完成。
- 失败 – 系统提交后作业失败,或者请求超出了Async SOQL限制。消息字段提供有关失败原因的详细信息。
- 运行- 工作成功运行,组织未超出任何限制。
- 计划- 新作业已创建并已安排,但尚未运行。
您也可以通过指定HTTP DELETE请求来取消查询 的jobId。取消已完成的查询无效。
请记住,异步SOQL是异步完成的。这意味着您的查询可能需要一段时间才能完成。就像我们之前提到的那样,如果时间紧迫,并且数据集足够小,请使用标准SOQL。或者,我们可以想象一下在这些例子中使用的不那么受欢迎的虚构游戏,但那里的乐趣在哪里呢?示例URI
https://yourInstance.salesforce.com/services/data/v41.0/async-queries/08PD000000003kiT
示例GET响应
{
"jobId": "08PD000000003kiT",
"message": "",
"query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
"status": "Success",
"targetObject": "Customer_Interaction_Analysis__c",
"targetFieldMap": {"Account__c":"Account__c",
"In_Game_Purchase__c":"Purchase__c" }
}
此响应显示我们的查询已成功完成。哇噢!是时候准备报告和仪表板了!
处理错误
在执行Async SOQL查询期间可能会发生两种不同类型的错误。
- 查询执行中的错误
- 将结果写入目标大对象的一个或多个错误
提交无效查询并超出其中一个异步SOQL限制是执行问题的示例。另一个示例是查询导致底层基础结构出现问题。对于这些错误,响应正文包含状态 失败。message参数提供有关失败原因的更多信息。
其他时候,查询成功执行但在尝试将结果写入目标对象时遇到错误。由于涉及的数据量很大,捕获每个错误都是低效的。相反,生成的错误的子集被捕获 BackgroundOperationResult对象并保留七天。您可以使用Async SOQL查询来查询此对象的jobId过滤特定Async SOQL查询的错误。异步SOQL作业信息保留一年。
把它包起来
现在您了解在您自己的组织中使用自定义大对象所需的一切。哈哈,现在有数十亿条记录。
我们只是触及了Async SOQL的表面。请务必查看资源部分,以查看Async SOQL支持的所有标准SOQL命令以及更多用例示例。您还可以找到有关可在POST请求中使用的可选字段的信息。另请参阅我们的Analytics数据集成基础知识模块,了解如何为从大对象中提取的数据设置分析。想想您可以使用所有数据制作的所有漂亮的图形和仪表板!