【发布时间】:2020-09-09 21:49:53
【问题描述】:
我在 HR 模式中创建了雇员表的副本。然后在employee_id 列上添加一个非唯一索引。
create table employees1 as select * from employees;
create index temp_idx on employees1(employee_id);
然后查看它的执行计划“selectemployee_id from employees;”,执行全表扫描,代价为3。然而,当我创建唯一索引时,执行索引全扫描,代价为1。
据我所知,oracle 创建唯一索引和非唯一索引的方式是相同的。所以叶子数等在两个索引中应该是相同的。那么在这种情况下,虽然它可以选择非唯一索引的索引全扫描并将成本降低到1,但为什么它选择全表扫描并导致更糟糕的计划呢?顺便说一句,创建表后我没有删除或插入任何行。
【问题讨论】:
-
这取决于很多因素。表中有多少行?每行在磁盘上消耗多少存储空间(多少字节)?
-
@Bohemian - 它不应该依赖任何东西。 OP 正在选择
all行,因此问题不在于使用索引进行快速访问。无论哪种方式都将执行完整扫描。 OP 的问题(有点误导,正如我在我的回答中解释的那样)是为什么 Oracle 不会从索引中读取所有employee_id值,在所有情况下它都应该小于整个表(整行)。跨度>
标签: oracle database-performance sqlperformance sql-tuning