У меня есть таблица с около 1 млн записей (работает SQL Server 2008). У меня есть процедура поиска, которая пытается сопоставить код продукта, а также описание продукта. Однако в некоторых случаях это очень медленно. Ниже (урезанный) заявление SQL:Почему этот оператор 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 = 'КРК-3020QWC-C'] или [СОДЕРЖАЩЕГО (p.FreeTextStrings, «" КРК-3020QWC * "')] индивидуально (но не оба) моментально. И если я сравниваю их вместе, это занимает много времени (несколько минут) и возвращает только одну строку.
IsEnabled и BaseSku индексируются, а FreeTextStrings индексируется FTS.
Я помню, что это работало отлично.
Можно ли пролить свет на это и предложить некоторые решения?
План выполнения Файл доступен здесь: http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip
Можете ли вы показать нам план выполнения с вашего SQL Server? –
Эти проблемы возникли после обновления SQL 2005 до SQL 2008. – Muxa