Xav*_*nas 11 sql-server performance sql-server-2008-r2 sql-execution-plan
我有一个存储过程,使用全文索引搜索产品(250,000行).
存储过程采用的参数是全文搜索条件.这个参数可以为null,所以我添加了一个空检查,查询突然开始运行速度慢了几个数量级.
-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
Run Code Online (Sandbox Code Playgroud)
以下是执行计划:
查询#1
查询#2
我必须承认我对执行计划不太熟悉.对我来说唯一明显的区别是连接是不同的.我会尝试添加提示,但在我的查询中没有加入我不知道该怎么做.
我也不太明白为什么使用名为IX_SectionID的索引,因为它是一个只包含列SectionID的索引,并且该列不在任何地方使用.
OR
可以粉碎性能,所以这样做:
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
IF @Filter IS NOT NULL
BEGIN
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
END
ELSE
BEGIN
SELECT TOP 100 ID FROM dbo.Products
END
Run Code Online (Sandbox Code Playgroud)
看看这篇文章:Erland Sommarskog在T-SQL中的动态搜索条件和这个问题:SQL Server 2008 - 条件查询.