1

我目前正在做一些测试,我注意到以下几点:

select field1 from table1

将导致index fast full scanwhenfield1是主键,因此成本较低(在我的情况下是4690),而

select field2 from table1

将导致 a table access full(没有约束也没有索引 on field2但即使使用常规索引,结果也是相同的),成本为117591

当索引/约束涉及 JOIN/WHERE 子句时,我知道增益,但在我的情况下,没有任何过滤:我不明白为什么 PK 应该更快,因为无论如何,我正在检索所有行。 ..

是因为独特吗?Tom 说唯一索引在结构上与传统索引相同,这真的让我想知道为什么选择 PK 会比任何其他列花费更少。

感谢您的启发:-)

rgds。

4

1 回答 1

4

单列 b 树索引不存储 NULL 行的数据。因此,如果您有一个索引field2field2允许NULL,Oracle 无法对索引进行扫描,而不会冒可能返回不正确数据的风险。因此,全表扫描是 Oraclefield2检索table1. 如果添加NOT NULL约束field2,Oracle 至少应该能够考虑对索引进行全扫描。

当然,优化器是否选择使用索引(以及它最终分配给使用索引的成本)将取决于您在索引和表上收集的统计信息。如果您的统计数据不准确,优化器的成本估计将不准确,因此生成的计划可能效率低下。这就是人们通常被建议谨慎对待甲骨文对计划成本的估计的原因之一——如果您正在查看一个计划,很可能是因为您怀疑它效率低下,这应该意味着你不能依赖成本。通常,您最好查看每个步骤的基数估计,并根据您的数据分布确定这些估计是否有意义。

于 2012-06-06T17:20:09.683 回答