0

据我了解,它应该很简单,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 Query 是如何工作的?它是否适用于当前行,是否执行所有 ORING 并移至下一个,或者它是否为每个 OR执行两个表的完整OR 。即使这样,只要单独的查询足够快,它也应该花费很长时间。我认为内部优化器可以非常快速地优化这一点:我将一张表的一列与第二张表的 4 列进行比较。它应该很容易优化。为什么需要这么长时间?有没有办法手动优化这个查询。顺便说一句,我尝试将 = 更改为 != 或 Or 更改为 AND,但这需要相同的时间。

4

2 回答 2

0

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

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

于 2012-09-20T22:43:01.803 回答
0

到目前为止,我已经使用了这个解决方案,执行需要 1 分 16 秒。另一方面,JOIN with OR 查询需要 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 
于 2012-09-25T21:02:08.620 回答