我昨天问了一个关于我们试图在我们的应用程序中重写/优化的过程的问题。它脱离了带有用户可以指定的一系列标准的搜索表单。40 个参数,其中 3 个是长字符串 Guid,我将它们传递到返回 Table 变量的 UDF 中,我们将所有 3 个参数都JOIN
放入我们的主FROM
语句中。
我们使用动态 SQL 完成了大部分查询,我们重写整个内容的主要原因之一是因为它是动态 SQL。我读过的关于动态 SQL 的所有内容都很糟糕,尤其是在执行计划和优化方面。然后我开始遇到像这两篇这样的文章......
Erland Sommarskog - T-SQL 中的动态 SQL 条件
我一直认为动态 SQL 对安全性和优化不利,但我们已尝试尽可能将其从系统中删除。现在我们正在重构系统中执行次数最多的查询(主搜索查询),我们认为剥离所有动态 SQL 会有所帮助。
基本取代
IF(@Param1 IS NULL)
@SQLString = @SQLString + " AND FieldX = @Param1"
...execute the @SQLString
有一个大的 SQL 块
WHERE (@Param1 IS NOT NULL AND FieldX = @Param1)
阅读这两篇文章,这似乎对我不利。我不能使用RECOMPILE
,因为我们仍然在 2k5 中,即使我们可以,这个存储过程的使用率也很高。我真的想用动态 SQL 编写这个查询吗?如果没有执行计划可以存储如何更快?