一般数据库问题 - 索引 ID 字段性能与限制(最高)性能 (Salesforce)

General Database Question - Indexed ID field Performance vs Limit (Top) Performance (Salesforce)

我正在解决(或至少确定)我们的 Saleforce 组织中查询性能不佳的可能原因。但是,我怀疑我的问题适用于大多数数据库引擎。

我们的 Salesforce 组织中有相当大量的数据。我们有问题的对象大约有 1500 万条记录。我们在我们的组织之上构建了一个 API 来拉回数据,我们确实在性能上苦苦挣扎。请知道,我们知道有些事情可以长期完成,但我的问题更多是关于了解数据库的底层查询引擎。

问题是这样的: 我们可以运行查询:

Select X From Account Where [IndexedField] Like 'value%' LIMIT 1000

出于某种原因,该查询将胜过以下查询:

Select X From Account Where [Id] = 'IdValue'

where 子句中的两个字段都已编入索引,但由于某些原因,单个 Id 过滤器需要一段时间才能 return 结果,您可能会更快地获得前 X 条记录。

了解到 SFDC 对其数据使用混合 EAV 方法,但他们的数据存储在 Oracle 数据库中,我怀疑这与 Oracle 执行搜索的通用方式有关。

为什么按 ID 查找单条记录可能比查找满足给定条件的 [X] 条记录需要更长的时间?我查看了查询计划,两者的成本都很低,显然 ID 的成本最低。

需要向我们的 UI 人员解释尽我所能搜索 1500 万条记录的影响。

答案可能有很多。 table 统计数据是最新的吗?数据库 运行 在什么硬件上? X7 Exadata 机器上的 Oracle 数据库性能调优与旧 V2 上的 运行 不同。您使用的 Oracle 版本 运行 也会对此产生影响,因为优化器存在差异。不同版本的 Oracle 可以以不同的方式处理相同的查询,即使它们在相同的硬件上也是如此。

Why might it take longer to find a single record by ID, than it would to find [X] records that meet a given criteria? I have looked at the query plans, both have low costs and obviously the ID has the lowest cost.

三个字:全Table扫描。您收集单个 ID 的查询是否需要完整 table 扫描?解释计划会告诉你。需要完整 table 扫描的查询可能比利用索引扫描的查询花费更长的时间。但是,根据您的环境,反之亦然。收集一系列值的第一个查询显然是在使用索引。为什么第二个查询不也使用该索引列?这可能是等式的一部分。

这是一个很棒的 AskTom 回答,它涉及到这个主题并详细解释了索引扫描的工作原理,尽管问题是从相反的角度提出的,即为什么索引扫描比完整 table 扫描慢。

https://asktom.oracle.com/pls/asktom/asktom.search?tag=blocks-read-using-index-vs-full-table-scan