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

时间:2011-07-05 15:56:24

标签: sql-server performance inner-join where subquery

有表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

OR

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中仅查找1000行A的匹配详细信息。

查询:

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

谢谢!

1 个答案:

答案 0 :(得分:3)

如果没有实际测量,很难预测这里的表现。

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

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