Mam tabelę z około 1 miliona rekordów (z systemem SQL Server 2008 Web). Mam procedurę wyszukiwania, która próbuje dopasować kod produktu, a także opis produktu. Jednak w niektórych okolicznościach jest bardzo powolny. Poniżej (cut-dół) Instrukcja SQL:Dlaczego ta instrukcja SQL jest bardzo powolna?
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;
Zauważ, że jeśli po prostu porównać na [p.BaseSku = 'KPK-3020QWC-C'] lub [contains (p.FreeTextStrings, „" KPK-3020QWC * "")] indywidualnie (ale nie jednocześnie) w jednej chwili. A jeśli porównuję je razem, zajmuje to kilka wieków (kilka minut) - i zwraca tylko jeden wiersz.
IsEnabled i BaseSku są indeksowane, a FreeTextStrings jest indeksowane FTS.
Pamiętam, że to było w porządku.
Czy ktoś może rzucić światło na to i zaproponować jakieś rozwiązania?
Plan Wykonanie plik jest dostępny tutaj: http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip
Czy możesz pokazać nam plan wykonania z serwera SQL? –
Te problemy zaczęły występować po uaktualnieniu SQL 2005 do SQL 2008. – Muxa