我有一个包含大约 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 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)