如果我有包含数百万条记录的表TABLE1,请说。 该表有COLUMN A,B和C. 我的指数为A和B. C根本没有编入索引。
之后我按照下面的方式进行查询
Select * from TABLE1 where A='something' and
B='something'
Select * from TABLE1 where
A='something' and B='something' and C='something'
我知道两个查询都将使用我指定的索引。根据我的理解,两个查询的性能应该是相同的。但是,查询是否有可能比其他查询具有更好的性能/运行速度?为什么呢?
答案 0 :(得分:2)
查询不一定会使用索引。 Oracle决定根据索引的“选择性”使用索引进行查询。因此,如果90%的行都有a = 'something' and b = 'something'
为真,则全表扫描比使用索引更快。
在这两种情况下,指数的选择性都是相同的(假设比较值相同)。所以两者都应该使用相同的执行计划。
即便如此,第二个查询通常会运行得更快一些,因为它通常会有一个较小的结果集。结果集的大小是查询性能的另一个因素。
顺便说一下,两者都可以利用table1(A, B, C)
上的索引。
此外,在“冷”数据库(一个刚开始没有运行查询的数据库)中,第二个应该运行得更快,原因很简单,部分或全部数据已经加载到页面和索引缓存中。