0
这个文章算是比较全面的,里面提到了两个解决方案,都还不错。
http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
Posted on
Wednesday, August 27, 2014
by
醉·醉·鱼
and labeled under
sql
早上例会提到了这么一个事情,大概知道老大说的什么,但是不是很明白。回来做了一个测试,用WHERE (@param IS NULL OR col = @param) 的确会比较糟糕。放狗一搜,文章不是很多,好在也能够找到几篇文章提到了这个。这个文章算是比较全面的,里面提到了两个解决方案,都还不错。
http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
问题
如下图所示,当用到WHERE (@param IS NULL OR col = @param) 的时候,会用到Index Scan,即使你在last_name上定义好了index。
解决方案
就现在而言,有两种解决方式。
1. OPTION(RECOMPILE)(SQL 2008 SP1/SP2/Later)
2. Dynamical SQL
可以改成
DECLARE @sql nvarchar(2000) = N'';
IF @param IS NOT NULL
SET @sql = @sql + 'select * from people p where p.last_name = @_lastName'
EXEC sys.sp_executesql @sql, N'@_lastName varchar(255)', @_lastName = @param
Post a Comment