带OR运算符的SQL性能不佳

时间:2016-12-11 21:15:39

标签: sql oracle11g sqlperformance

我有一个带有索引字段year的表格,我在某些查询中遇到了糟糕的表现,而且我可以'明白为什么。使用这样的查询:

select ..... where year = 2016 ...

我的表现很好,但有这样的查询:

select .... where ((year = 2016 and month = 1) or (year = 2015 and month = 7)) ...
事情变得非常缓慢...为什么在最后一种情况下没有在year字段上使用索引?我知道为什么在查询中性能会很差:

select .... where year = 2016 or month = 1

但为什么在我的情况下?

提前谢谢!

1 个答案:

答案 0 :(得分:4)

yearmonth上建立索引并使用:

where (year, month) in ( (2016, 1), (2015, 7) )

Oracle应该足够聪明,可以使用复合索引进行查询。这个版本更简洁,更容易编写和阅读。