“INNER JOIN 之前的 Sub SELECT”还是“INNER JOIN 之后的 WHERE”?

Posted

技术标签:

【中文标题】“INNER JOIN 之前的 Sub SELECT”还是“INNER JOIN 之后的 WHERE”?【英文标题】:"Sub SELECT before INNER JOIN" or "WHERE after INNER JOIN"? 【发布时间】:2011-09-28 22:56:20 【问题描述】:

有表 A 和表 B。我想在两列上连接这些表,但只针对表 A 的选定行。

查询场景:

SELECT B.*
FROM B
INNER JOIN (SELECT * FROM A WHERE A.COLUMN1 BETWEEN somevalue1 AND somevalue2) C
ON B.COLUMN2 = C.COLUMN2
AND B.COLUMN3 = C.COLUMN3

SELECT B.*
FROM B
INNER JOIN A
ON B.COLUMN2 = A.COLUMN2
AND B.COLUMN3 = A.COLUMN3
WHERE A.COLUMN1 BETWEEN somevalue1 AND somevalue2

表 A 和 B 都有数百万条记录。使用 WHERE 条件表 A 将只返回 1000 个结果,因此要执行的实际连接是从 B 中查找匹配的详细信息,仅匹配 A 的 1000 行。

查询:

哪一个应该更快? (我无权查看查询执行计划

谢谢!

【问题讨论】:

如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ( )工具栏以很好地格式化和语法突出显示它! 【参考方案1】:

如果不进行实际测量,很难在这里预测性能。

我的直觉认为后一种选择应该更快,因为优化器可能希望在连接之前完全实现内部查询,除了本身速度很慢之外可能破坏任何可能有帮助的索引一起加入。另一方面,后一种选项的优化器应该仍然足够聪明,可以在连接之前预过滤表 A,没有破坏索引的风险,并且只能实现与连接匹配的结果.不过,请注意那里所有的鼬鼠词;在这种情况下,我的直觉可能会偏离。从中吸取的真正教训是衡量您的查询在尽可能接近实际的条件下使用真实数据。

更重要的是,我更喜欢后者,因为 (imo) 它更具可读性和可维护性。

【讨论】:

以上是关于“INNER JOIN 之前的 Sub SELECT”还是“INNER JOIN 之后的 WHERE”?的主要内容,如果未能解决你的问题,请参考以下文章