Eri*_*ker 5 sql t-sql sql-server-2008
一个WHERE条款有什么好处?
我有一张大桌子,FK到一张小桌子.我可以直接在FK上搜索,或者我可以加入FK表并WHERE在连接表上设置限制.什么是更好/更好?
所以这:
SELECT lt.* FROM LargeTable lt
WHERE lt.SomeId in(12,55)
Run Code Online (Sandbox Code Playgroud)
或这个:
SELECT lt.* FROM LargeTable lt
INNER JOIN SmallTable st ON lt.SomeId=st.ItemId
WHERE st.Id in(12,55)
Run Code Online (Sandbox Code Playgroud)
我测试了这个Set statistics time on,但我没想到这个结果.谁能解释这里发生了什么?
首次测试没有加入:
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 1544 ms, elapsed time = 1580 ms.
Run Code Online (Sandbox Code Playgroud)
第二次测试加入
(946 row(s) affected)
SQL Server Execution Times:
CPU time = 2636 ms, elapsed time = 366 ms.
Run Code Online (Sandbox Code Playgroud)
编辑:当我这样做SELECT Id而不是SELECT *,那么没有连接的第一个查询具有较低的经过时间,并且执行计划中的查询成本对于无连接为25%,对于具有连接的查询为75%.
根据您的执行计划,两个查询本质上都是扫描整个大表中的每条记录...第二个查询只是在扫描大表之前从小表中查找一小组记录,这就是相对成本为 50 的原因% 对彼此而言。
我建议考虑在 上建立索引largeTable.SomeId,然后进行第一个查询:
SELECT lt.* FROM LargeTable lt
WHERE lt.SomeId in(12,55)
Run Code Online (Sandbox Code Playgroud)
编辑:
所以最大的问题是为什么带有连接的查询的持续时间比没有连接的查询的持续时间短。
我认为马丁·史密斯给出了这个问题的答案:
你的第二个有一个并行计划,第一个没有
您会注意到,第一个查询的 CPU 时间较短,但运行时间较长。粗略地总结一下,您的第一个查询需要服务器花费较少的精力来完成,但是您的第二个查询使用并行计划,并使用多个处理器来执行查询,因此完成所需的时间较少,但总体工作量更大。