gpt4 book ai didi

sql - 什么时候在 SQL Server 2005 中限制联接是有利的?

转载 作者:行者123 更新时间:2023-12-04 18:26:52 25 4
gpt4 key购买 nike

例如,假设您有这样的查询:

SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.field1 = t2.field1 AND t1.year = t2.year
JOIN table3 t3 ON t1.field1 = t3.field1 AND t1.year = t3.year
JOIN table4 t4 ON t3.field2 = t4.field2 AND t3.year = t4.year
WHERE t1.year = '2010'

这样做是否更快:

SELECT *
FROM table1 t1
JOIN table2 t2 ON t1.field1 = t2.field1 AND t1.year = t2.year AND t2.year = '2010'
JOIN table3 t3 ON t1.field1 = t3.field1 AND t1.year = t3.year AND t3.year = '2010'
JOIN table4 t4 ON t3.field2 = t4.field2 AND t3.year = t4.year AND t4.year = '2010'
WHERE t1.year = '2010'

哪个“更快”并不总是很明显。有时 SQL Server 2005 中的执行计划说一个比另一个快,这取决于索引。有时它会进行所有哈希匹配,这似乎是 CPU 密集型的,而排序然后合并连接似乎更 IO 密集型。给定执行计划的结果,现实世界的结果并不总是反射(reflect)人们的预期。


有人可以为我澄清一些简单的场景,其中一个比另一个更好吗?或者至少验证我的理解是否正确?在我看来,如果您正在加入索引良好的列,那么不使用年份或其他一些数据来约束连接会更有效,因为它可以使用基于索引的哈希匹配并且不需要排序并使用临时表。

但是,如果您在两个查询中选择和连接非索引列,添加时间约束会导致要处理的行更少,并导致更快的排序和合并连接,即使它会导致一些(更多?) IO 成本。


此外,让我感到困扰的是,从 table2 进行的预连接选择没有考虑 table1 上的 where 子句所产生的有限值子集,当不对 table2 使用约束时,它似乎选择了 table2 中的所有行加入。由于来自 table1 的行将被限制为 b WHERE t1.year = '2010' 并且连接受 t1.year = t2.year 限制,难道不应该遵循连接只需要查看 table2 where year = ' 2010'?

我想知道为什么它不首先查看 where 子句,甚至在进行连接之前只选择匹配的行,我敢肯定这背后有一些很好的推理,但根据执行计划,它逃脱了我,在这种情况下,从 table2 查看的行数确实会发生变化,具体取决于您是否已将 t2.year = '2010' 添加到连接中。

在此先感谢您,对于这么长的问题深表歉意。我试图尽可能清楚。请原谅我的经验不足。

最佳答案

“它更快吗?”没有。

查询优化器将决定哪个是最严格的结果集过滤器(如果您的统计信息是最新的,通常会做得很好)。

关于sql - 什么时候在 SQL Server 2005 中限制联接是有利的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5428604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com