0

我昨天问了一个关于我们试图在我们的应用程序中重写/优化的过程的问题。它脱离了带有用户可以指定的一系列标准的搜索表单。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 编写这个查询吗?如果没有执行计划可以存储如何更快?

4

0 回答 0