gpt4 book ai didi

大表上的 SQL WHERE -> 先加入小表还是直接在 WHERE 子句中放 FK?

转载 作者:行者123 更新时间:2023-12-04 20:19:11 24 4
gpt4 key购买 nike

什么是更好的 WHERE条款?

我有一张大 table ,一张 FK 到一张小 table 。我可以直接在FK上搜索,也可以加入FK表并设置WHERE对连接表的限制。什么更好/更可取?

所以这:

SELECT lt.* FROM LargeTable lt 
WHERE lt.SomeId in(12,55)

或这个:
SELECT lt.* FROM LargeTable lt 
INNER JOIN SmallTable st ON lt.SomeId=st.ItemId
WHERE st.Id in(12,55)

我用 Set statistics time on 测试了这个,但我没想到会是这样。谁能解释这里发生了什么?

第一个没有加入的测试:
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 1544 ms, elapsed time = 1580 ms.

加入的第二次测试
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 2636 ms, elapsed time = 366 ms.

编辑:当我这样做时 SELECT Id而不是 SELECT * ,那么没有连接的第一个查询的运行时间较短,执行计划中的查询成本是 25%(无连接) vs 75%(有连接的查询)。

最佳答案

根据你的执行计划,这两个查询本质上都是在扫描整个大表中的每一条记录……第二个查询只是在扫描大表之前从小表中找到一小部分记录,这就是为什么相对成本是50 % 对彼此而言。

我建议考虑在 largeTable.SomeId 上建立索引,然后继续第一个查询:

SELECT lt.* FROM LargeTable lt 
WHERE lt.SomeId in(12,55)

编辑:

所以最大的问题是为什么有连接的查询比没有连接的查询的持续时间更短。

我认为 Martin Smith 给出了这个问题的答案:

Your second one gets a parallel plan the first one doesn't



您会注意到第一个查询的 CPU 时间较短,但耗时较长。粗略地总结一下,您的第一个查询使服务器完成的工作较少,但您的第二个查询使用了并行计划,并征用了多个处理器来执行查询,因此完成所需的时间更少,但总体工作量更大。

关于大表上的 SQL WHERE -> 先加入小表还是直接在 WHERE 子句中放 FK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592840/

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