索引是否可以改进各种查询?

时间:2013-07-07 03:49:34

标签: sql database oracle indexing

假设我有一个书籍表定义如下:

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

2 个答案:

答案 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访问。

这篇文章很好地解释了这一切。