我有一个包含大约 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/