常规数据库问题 - 索引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)的主要内容,如果未能解决你的问题,请参考以下文章