为什么这两个查询的表现如此不同?

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 执行工厂#1

查询#2 执行工厂#2

我必须承认我对执行计划不太熟悉.对我来说唯一明显的区别是连接是不同的.我会尝试添加提示,但在我的查询中没有加入我不知道该怎么做.

我也不太明白为什么使用名为IX_SectionID的索引,因为它是一个只包含列SectionID的索引,并且该列不在任何地方使用.

KM.*_*KM. 8

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 - 条件查询.