Dam*_*ien 24 t-sql parameters performance
我希望能够传入一个参数列表,并忽略那些为NULL的参数.这样查询实际上假装过滤器不存在并忽略它.
我是这样做的:
(@thing IS NULL or Thing=@thing)
Run Code Online (Sandbox Code Playgroud)
这是对的,如果是的话,它会表现得很糟糕吗?它似乎比分别构造SQL要慢很多.
这样做的最佳方法是什么?
固定!请参阅Marc Gravell的回答.总之,使用IS NULL多次是一个很大的性能影响.
Mar*_*ell 21
一旦你获得了超过其中的几个,那么是的:它开始变得非常缓慢.在这种情况下,我倾向于使用生成的TSQL - 即
DECLARE @sql nvarchar(4000)
SET @sql = /* core query */
IF @name IS NOT NULL
SET @sql = @sql + ' AND foo.Name = @name'
IF @dob IS NOT NULL
SET @sql = @sql + ' AND foo.DOB = @dob'
// etc
EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
@name, @dob
Run Code Online (Sandbox Code Playgroud)
等等
请注意,sp_ExecuteSQL缓存查询计划,因此具有相同args的任何查询都可能会重新使用该计划.
缺点是除非您签署SPROC,否则调用者需要对表的SELECT权限(而不仅仅是SPROC上的EXEC权限).
Bre*_*ick 12
我会这样处理它.
WHERE Thing = ISNULL(@Thing, Thing)
Run Code Online (Sandbox Code Playgroud)
如果您只是将参数用作where子句的过滤器,那么这将非常有效.如果参数为null,它将忽略该参数.
我一般用
WHERE (id = @id OR @id IS NULL)
AND (num = @num OR @num IS NULL)
Run Code Online (Sandbox Code Playgroud)
等等
归档时间: |
|
查看次数: |
28184 次 |
最近记录: |