gpt4 book ai didi

sql - 为什么这个SQL语句很慢?

转载 作者:行者123 更新时间:2023-12-02 12:19:12 25 4
gpt4 key购买 nike

我有一个包含大约 100 万条记录的表(运行 SQL Server 2008 Web)。我有一个搜索例程,尝试匹配产品代码和产品描述。但在某些情况下,速度非常慢。下面是(精简的)sql 语句:

WITH AllProducts AS (
SELECT p.*, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
FROM Product AS p
WHERE p.IsEnabled=1 AND
(
p.BaseSku = 'KPK-3020QWC-C' -- this on its own is fast
OR
CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"') -- and this on its own is fast, but not both
)
) SELECT * FROM AllProducts
WHERE RowNumber BETWEEN 1 AND 20;

请注意,如果我只是单独比较 [p.BaseSku = 'KPK-3020QWC-C'] 或 [CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"')] (但不是两者)其即时。如果我将它们比较在一起,需要很长时间(几分钟) - 并且只返回一行。

IsEnabled 和 BaseSku 已建立索引,FreeTextStrings 已建立 FTS 索引。

我记得这之前工作得很好。

任何人都可以阐明这一点并提出一些解决方案吗?

执行计划文件可在此处获取:http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip

最佳答案

or 在 SQL Server 上是出了名的慢。至少可以说,这很令人恼火。

尝试使用union将其分成两个查询:

WITH AllProducts AS (
select *, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
from (
SELECT p.*
FROM Product AS p
WHERE p.IsEnabled=1 AND
p.BaseSku = 'KPK-3020QWC-C'
UNION
SELECT p.*
FROM Product AS p
WHERE p.IsEnabled=1 AND
CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"')
)
) SELECT * FROM AllProducts
WHERE RowNumber BETWEEN 1 AND 20;

关于sql - 为什么这个SQL语句很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291975/

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