优化where子句SQL

时间:2013-05-13 22:49:16

标签: sql oracle

我试图找出一种优化以下SQL查询的方法:

select * from SOME_TABLE
where (col1 = 123 and col2 = 'abc') 
   or (col1 = 234 and col2 = 'cdf')
   or (col1 = 755 and col2 = 'cvd') ---> I have around 2000 'OR' statements in a single query.

目前这个查询需要很长时间才能执行,所以无论如何都要让这个查询运行得更快吗?

3 个答案:

答案 0 :(得分:3)

  • 创建一个查找表CREATE TABLE lookup (col1 INT, col2 VARCHAR(3), PRIMARY KEY(col1, col2), KEY(col2)) ORGANIZATION INDEX或任何符合您需求的内容
  • 确保原始表(col1和col2)
  • 上有索引
  • 使用2000种组合填充查找表

现在查询

SELECT 
  mytable.*
FROM mytable
INNER JOIN lookup ON mytable.col1=lookup.col1 AND mytable.col2=lookup.col2

答案 1 :(得分:2)

很难说没有看到查询计划,但我想这会解决为FTS,其中有很多CPU在执行OR逻辑。

如果一般模式是col1 = x和col2 = y,那么尝试使用2000对创建一个表,然后加入。如果您的2000对来自其他表,请将select语句直接考虑在SELECT语句中。

同时确保你已经拥有所有唯一和NOT NULL约束,因为这会产生影响。考虑col1&的索引。如果它不使用它,不要感到惊讶。

不确定这是否可以解决问题,但如果没有,请发布更多细节。

答案 2 :(得分:0)

只选择您想要的列,而不是全部(*)......但是你肯定知道这一点。 但是如果你的SQL语句中有超过2000个OR,那么也许是时候改变它了!如果您向我们解释有关您的数据库的更多信息,我们会更好地帮助您。