常规数据库问题 - 索引ID字段性能与限制(顶部)性能(Salesforce)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常规数据库问题 - 索引ID字段性能与限制(顶部)性能(Salesforce)相关的知识,希望对你有一定的参考价值。

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

我们的Salesforce组织中有相当大量的数据。我们有问题的对象有15M记录。我们在我们的组织之上构建了一个API,它可以回收数据,我们真的在努力实现性能。请知道,我们知道有些事情可以长期完成,但我的问题更多的是关于理解数据库的基础查询引擎。

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

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

出于某种原因,该查询将胜过查询,例如:

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

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

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

为什么按ID查找单个记录可能需要更长的时间,而不是找到符合给定条件的[X]记录?我查看了查询计划,两者都有低成本,显然ID具有最低的成本。

需要向我们的UI人员解释在我的能力范围内搜索15M记录的影响。

答案

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

为什么按ID查找单个记录可能需要更长的时间,而不是找到符合给定条件的[X]记录?我查看了查询计划,两者都有低成本,显然ID具有最低的成本。

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

这是一个很好的AskTom答案,涉及这个主题并详细解释了索引扫描是如何工作的,尽管问题是从相反的角度来看为什么索引扫描比全表扫描慢。

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

以上是关于常规数据库问题 - 索引ID字段性能与限制(顶部)性能(Salesforce)的主要内容,如果未能解决你的问题,请参考以下文章

min非常规优化

Oracle 索引失效的六大限制条件

如何为性能索引字段?

分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件

order by与索引(转载)

[转]order by 与索引