gpt4 book ai didi

SQL Server 2008 执行计划问题

转载 作者:行者123 更新时间:2023-12-04 21:40:27 24 4
gpt4 key购买 nike

我有一个问题要问 sql guru。

有两个结构几乎相同的表。

基于传递给存储过程的参数,我需要从一个或另一个表中收集数据。

如何以最好的方式做到这一点?

请不要建议将这些表格合并为一个 - 这是不合适的。

我是按照 (MS SQL Server 2008) 做的:

Select *
FROM
String s
JOIN (
SELECT id
,TypeCode
,ProdNo
FROM Table1
WHERE @param = 1 AND TypeCode= 'INV'

UNION

SELECT id
,TypeCode
,ProdNo
FROM Table2
WHERE @param = 2 AND TypeCode= 'INV'

) m ON m.Id = s.Id
WHERE s.Id = 256

但是当我查看执行计划时,我感到很惊讶,因为它从并行线程中的两个表中获取数据,并且仅在通过 @param 值过滤之后。

我认为过滤将在第一阶段进行,并从单个表中收集数据。

有没有办法只从一个表中选择而不将查询分成两个查询并使用 IF 运算符?

谢谢

最佳答案

你真的需要阅读 Dynamic Search Conditions in T-SQL by Erland Sommarskog .您不必担心重复代码,这不是一些家庭作业。只需担心使执行计划使用索引。当使 SQL 代码“漂亮”时,唯一需要考虑的是缩进和大小写,任何其他更改都可能导致查询计划变慢。我已经看到对超快查询的微小更改导致超慢查询。 GO FOR SPEED(索引使用)并根据需要复制代码。另见:The Curse and Blessings of Dynamic SQL

您标记了问题 sql-server-2008,因此如果您正在运行 SQL 2008 SP1 CU5 (10.0.2746) 和 SQL 2008 R2 CU1 (10.50.1702) 及更高版本,则会出现新行为(如在OPTION(RECOMPILE) 的“动态搜索条件”文章),它并未出现在 SQL 2008 或 2005 的所有版本中。此行为基本上在运行时评估 @Local_Variables 值并重新编译查询因此。在您的情况下,这应该会导致您的 UNION 的一半在编译时被消除。

关于SQL Server 2008 执行计划问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202677/

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