我发现如果在搜索中使用,我的SQL 2008 R2数据库真的很难使用COALESCE功能。
CODE:
where
i.id_categ = COALESCE(@id_categ, i.id_categ )
and i.id_brand = COALESCE(@id_brand , i.id_brand )
and i.id_model = COALESCE(@id_model , i.id_model )
and i.id_type = COALESCE(@id_karoseria, i.id_type )
and i.id_fuel = COALESCE(@id_palivo, i.id_fuel )
and (i.year between @year_from and @year_to)
and (i.price between @price_from and @price_to)
DYNAMIC变量:
ALTER PROCEDURE [dbo].[spInzeratSelect]
@id_categ int = null,
@id_brand int = null,
@id_model int = null,
@id_fuel int = null,
@id_type int = null,
搜索应该使用或不使用这些变量。
基准:
with COALESCE = Total Execution Time: 3582
without COALESCE conditions = Total Execution Time: 13
你得到了不同......
有一个很好的解决方案如何忽略COALESCE并使用不同的approch创建动态SQL选择?
感谢。
答案 0 :(得分:2)
在非常具体的情况下,您应该使用以下模式替换所有COALESCE
搜索参数:
AND ( (@id_brand IS NULL) OR (i.id_brand = @id_brand) )
等
参数在执行前被计算为文字,因此这样做会使条件成为可搜索的。 这在功能上等同于您的查询,除非您首先检查文字值,如果它实际上是null,则可以对其进行优化。
编辑:显然这也是@Joe Stefanelli链接中推荐的方法。我最初是从Erland Sommerskog那里偷猎的。
EDIT2:我也总是忘记提及OPTION (RECOMPILE)
。