为什么第一个查询使用全表扫描而第二个查询使用索引?
SELECT *
FROM emp
WHERE job = 'PRESIDENT';
和
SELECT job
FROM emp
WHERE job = 'PRESIDENT';
答案 0 :(得分:2)
很简单,因为优化器已经计算出第一个查询的完整扫描成本低于基于索引的访问方法的成本。
这似乎是一种不太可能的情况,因为你本能地只期望一行匹配job ='PRESIDENT'条件,但是如果你想象50%的行匹配那个条件那么读取带有多块读取的完整表将比读取索引更快,然后在可能更小的读取中读取表。
在第二个查询的情况下,优化器知道不需要访问表来提供正确的答案,因此除非表格非常窄,否则使用索引范围扫描或快速更快完整索引扫描以返回结果。
此处教授的课程可能是您只应返回所需的列。一个辅助教训是,大多数抽象层(例如ActiveRecord)默认情况下会比它们需要的速度慢,因为它们总是会返回每一列。
答案 1 :(得分:1)
第二个查询仅选择列“作业”。选择索引时,此列的值已知。查询不需要任何其他内容,因此无需从表中读取任何其他数据。
对于第一个查询,它更难。通常Oracle应该访问索引。本专栏中有多少个不同的职位?在基数(即选择性)低的情况下,全表扫描可以比索引扫描更快。在这种情况下,我们可以假设表中只有1个 PRESIDENT ,但Oracle已根据统计和估算评估执行计划。其他工作,例如“CLERK”全表扫描将是获取数据的禁令,我猜想。