假设我有一个书籍表定义如下:
table book(id varchar(50), title varchar(100),type varchar(20),publisher varchar(20), price float)
假设在ID上定义了索引。现在,将改进使用该ID的查询,例如:
select * from book where id='abcd123456'
但是,使用其他字段的查询也会得到改进吗?例如,这两个查询:
select * from book where title = 'algorithms'
select * from book where price > 25
答案 0 :(得分:2)
不,它不会。但是,如果一列上有索引,并且查询涉及该列和其他列,则可以使用索引(如果可以的话)。
答案 1 :(得分:2)
每个进入sql性能调优的人都应该阅读Tuning by cardinality feedback by Wolfgang Breitlingi
至于你的问题 - 只有在访问整个表时,oracle才会选择索引访问路径。它通过估算每个执行计划的成本来做到这一点。
在您的示例中,如果id
是唯一的,那么oracle需要1行 - 索引成本正在访问索引头+到达叶子(通常是2个块读取)+表块访问(通常是1个块) - 总计~4 CR。
执行FTS(全表扫描)将导致读取表中的所有块。成本是表中的块数除以db_file_multiblock_read_count
。
如果FTS成本超过4 oracle将执行索引唯一扫描。
关于非唯一谓词的第二个问题 - 如果oracle估计price > 15
将导致更少的行,他将更喜欢索引访问,否则他将更喜欢FTS访问。
这篇文章很好地解释了这一切。