【发布时间】:2012-09-13 05:40:37
【问题描述】:
根据我的理解应该很简单,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 的两个表中的 em>。即使这样,只要单独的查询足够快,它也应该花费很长时间。我认为内部优化器可以非常快速地优化这一点:我将一张表的一列与第二张表的 4 列进行比较。它应该很容易优化。为什么需要这么长时间? 有没有办法手动优化这个查询。顺便说一句,我尝试将 = 更改为 != 或 Or 更改为 AND,但这需要相同的时间。
【问题讨论】:
-
您到底想做什么?连接用于指向两个表之间的公共字段。如果您尝试在两个表之间查找匹配项,请使用 WHERE 子句。
-
这些桌子的尺寸是多少?连接字段上是否定义了索引?
-
我高度怀疑首先需要这种加入的模式设计。修复架构可能是优化性能的最佳机会。
-
作为最后的努力,您可以使用连接提示来强制连接类型以查看是否有任何改进:msdn.microsoft.com/en-us/library/ms173815.aspx 和 stackoverflow.com/questions/2446927/sql-server-2008-join-hints
标签: sql sql-server-2005 join query-optimization