SQL OR查询如何工作

时间:2012-09-20 19:35:32

标签: sql sql-server-2005 join query-optimization

对我来说,它应该很简单,colA ='X'或ColB ='X',如果其中任何一个为真,则返回结果,否则不返回。

TableA
╔════╦═══╦═══╦═══╦═══╗
║ id ║ A ║ B ║ C ║ D ║
╠════╬═══╬═══╬═══╬═══╣
║ 1  ║ x ║ x ║ x ║ x ║
║ 2  ║ x ║ x ║ x ║ x ║
║ 3  ║ x ║ x ║ x ║ x ║
╚════╩═══╩═══╩═══╩═══╝

TableB
╔════╦═══╗
║ id ║ A ║
╠════╬═══╣
║  1 ║ x ║
║  2 ║ x ║
║  3 ║ x ║
╚════╩═══╝

select T2.ID from tableA T1
JOIN TableB T2
ON T1.A=T2.A OR T1.B=T2.A OR T1.C=T2.A OR T1.D=T2.A /* **takes 6+ min** */

这个简单的连接需要6分钟以上。如果我只使用一个字段加入,那么它很快。 此外,如果我写了4个不同的查询,每个OR一个,然后联合结果,它也很快

我的问题是, SQL OR查询是如何工作的?它是否适用于当前行,是否所有ORING都继续运行到下一个或是否执行完成OR 每个OR 的两个表中的em>。即使这样,它也应该花费很长时间,因为单独的查询足够快。我认为内部优化器可以非常快速地对其进行优化:我将一个表中的一列与第二个表中的四列进行比较。它应该很容易优化。为什么需要这么长时间? 有没有办法手动优化此查询。顺便说一句,我尝试将=更改为!=或或更改为AND,但它需要相同的时间。

2 个答案:

答案 0 :(得分:0)

当使用多个“OR”条件时,将评估所有条件,即使有很多条件,并且第一个评估的条件返回true。

通过编写单独的查询并将结果与​​联合组合,您可以有效地减少完成的工作。这是因为第一个查询的结果中包含的行不需要在其他3个查询中进行评估,第二个查询中的行不需要在第3个和第4个查询中进行评估等。

答案 1 :(得分:0)

到目前为止,我已经使用过此解决方案,执行时需要1分16秒。另一方面,带OR查询的JOIN需要30分钟,两个查询的结果不一样。

select T2.ID from tableA T1
JOIN TableB T2
ON T1.A=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.B=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.C=T2.A 

UNION

select T2.ID from tableA T1
JOIN TableB T2
ON T1.D=T2.A