7

编写查询的最佳方法是什么,这将给出等效的结果:

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

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

4

4 回答 4

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 创建为表变量。

于 2012-08-30T11:30:57.913 回答
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
于 2012-08-30T11:33:20.050 回答
3

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

喜欢:

DECLARE @Temp TABLE
(
X int,
Y int
)

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

(或保存搜索设置的其他物理表。)

于 2012-08-30T11:31:52.463 回答
0

如果您使用太多 or 语句,则执行计划不会使用索引。最好创建多个语句并使用 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...
于 2016-02-24T14:06:20.527 回答