gpt4 book ai didi

sql-server - 为什么这两个查询的性能如此不同?

转载 作者:行者123 更新时间:2023-12-02 09:31:23 27 4
gpt4 key购买 nike

我有一个使用全文索引搜索产品(250,000 行)的存储过程。

存储过程的参数是全文搜索条件。该参数可以为空,因此我添加了空检查,查询突然开始运行速度减慢了几个数量级。

-- 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)

以下是执行计划:

查询 #1 Execution plant #1

查询 #2 Execution plant #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

看这篇文章:Dynamic Search Conditions in T-SQL by Erland Sommarskog这个问题:SQL Server 2008 - Conditional Query .

关于sql-server - 为什么这两个查询的性能如此不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com