Sharing:当前的查询将会使用索引进行查询。当前的索引基于当前执行SQL的人的共享规则来决定的。如果有 sharing rule限制了user可以访问的记录情况下,salesforce可以根据这些共享规则去进行优化;
TableScan:当前的查询方式为查询当前表的所有数据;
Other:salesforce将使用内部的优化方式去查询。
Cost:与Force.com查询优化器的选择性阈值相比,查询的成本。 如果这个值大于1表示查询不会是selective的。
sObject Cardinality:查询当前对象大概的记录数;
sObject Type:当前查询表的 object的名字。
以上的就是关于查询的Plan表的各个列的名词解释。下图附上一张 Cost超过1的情况,因为查询的 filter没有索引字段,所以查询非 selective,cost超过了1.
我们通过Notes等信息以及上面的表格便可以查看到对SOQL进行优化建议。细节得 Query Plan Tool介绍我们可以查看上方得链接中官方描述得文档。上面我们提到了 selective的SOQL必须是包含索引字段,那么在salesforce的世界里面哪些是索引字段,怎么设置索引字段呢???
三. Index(索引)
索引这个概念不止针对salesforce的SOQL,其他的类似SQL server以及 Oracle都有索引的概念,查询的filter中通过索引字段可以加快查询的速度。具体的索引的含义也可以查看上面的百度百科的文档。Salesforce针对索引字段有标准和自定义两种。我们如何知道当前哪些字段是索引字段呢?只需要进入field中,查看Indexed这列信息即可,下图展示Account表中的一些索引字段的截图。
1. 标准索引字段
salesforce针对几乎所有的表的以下字段维护了索引。分别是:RecordTypeId 、 Division、 CreatedDate、Systemmodstamp (LastModifiedDate)、Name、Email (for contacts and leads)、Foreign key relationships (lookups and master-detail)、Salesforce记录得 Record Id。也就是说表中的这些的字段,salesforce大部分已经自行维护了索引字段用来优化查询,无需在进行设置索引。
2. 自定义索引字段
当然,一个项目不可能只使用标准字段,我们还是需要创建自定义字段去实现相关得自定义逻辑。针对自定义字段同样可以设置成索引字段。当然不是所有得类型都可以设置索引字段,以下得类型salesforce不支持设置索引字段:multi-select picklists / text area (long) / text area (rich) / non-deterministic formula fields / encrypted text。编辑字段以后,勾选external Id外键以后,便成了被标记成索引得字段。外键仅可以Auto Number / Email / Number / Text类型中创建。当然,凡事不是那么绝对,如果需要在其他得字段类型中创建自定义得索引字段,包括标准字段,可以联系salesforce得support人员,他们可以进行设置。
上面有一个描述是non-deterministic formula fields不支持创建索引字段得,并不是代表formula不支持索引,只是部分情况不支持。上方得index文档中有具体描述,感兴趣自行查看。
这里扩充两个对大量数据的SOQL比较灾难的两个filter,又常常是我们经常用到的。一个是使用 formula字段进行 filter,一个是使用 null 进行filter。怎么样,项目上使用的是不是很常见?数据量少的时候OK,当真正数据量达到一定程度,你会发现这两种都是灾难性的。因为这两个默认的都是不带索引的!!!如果项目中遇到了这两种使用在filter中,并且数据量很庞大,找salesforce提support设置索引,salesforce可以针对 null单独设置索引。比如我们针对某个自定义字段 XX__c设置了 index,我们的SOQL :
select Id,Name from Account where XX__c = null