昨天我问了一个关于我们试图在我们的应用程序中重写/优化的程序的问题。它来自一个搜索表单,其中包含一组用户可以指定的标准。 40个参数,其中3个是Guids的长字符串,我将其传递给返回Table变量的UDF,其中所有3个JOIN
都放入我们的主FROM
语句中。
我们使用动态SQL做了很多这样的查询,我们重写整个事情的主要原因之一是因为它是动态SQL。我读过的关于动态SQL的一切都很糟糕,特别是对于执行计划和优化。然后我开始看到像这两个文章....
Sometimes the Simplest Solution isn't the Best Solution
Erland Sommarskog - Dynamic SQL Conditions in T-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中编写此查询吗?如果不能存储执行计划,怎么会更快?