使用WHERE子句中的许多OR语句优化查询

时间:2012-08-30 11:27:39

标签: sql sql-server sql-server-2008

编写查询的最佳方法是什么,它会给出相同的结果:

SELECT X,Y,* FROM TABLE
WHERE (X = 1 AND Y = 2) OR (X = 2235 AND Y = 324) OR...

表具有聚集索引(X,Y)。 表格很大(数百万),可能有数百个OR语句。

4 个答案:

答案 0 :(得分:4)

您可以创建另一个包含X和Y列的表 并在该表中插入值,然后与原始表

连接
create table XY_Values(X int, Y int)

Insert into XY_Values values
(1,2),
(2235,324),
...

然后

SELECT X,Y,* FROM TABLE T
join XY_Values V
on T.X=V.X
and T.Y=V.Y

您可以在XY_Values上的(X,Y)上创建一个索引,这将提升性能

你也可以创建XY_Values作为表变量..

答案 1 :(得分:3)

我认为你可以用数百个X和Y值填充临时表,并加入它们。

像:

DECLARE @Temp TABLE
(
X int,
Y int
)

根据您的搜索要求预先填写,然后加入。

(或另一个保存搜索设置的物理表。)

答案 2 :(得分:3)

这会做得更好

select t.* 
from table t
join (select 1 as x,2 as y
      union
      ...) t1 on t.x=t1.x and t.y=t1.y

答案 3 :(得分:0)

如果您使用太多或语句,执行计划将不使用索引。 最好创建多个语句并使用union all合并结果。

SELECT X,Y,* 
FROM TABLE
WHERE (X = 1 AND Y = 2) 
union all
SELECT X,Y,* 
FROM TABLE
WHERE (X = 2235 AND Y = 324) 
union all...