Ho una tabella con circa 1 milione di record (con SQL Server 2008 Web in esecuzione). Ho una routine di ricerca che cerca di far corrispondere il codice del prodotto e la descrizione del prodotto. Tuttavia in alcune circostanze è molto lento. Qui di seguito è (cut-down) dichiarazione di sql:Perché questa istruzione SQL è molto lenta?
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;
Nota che se ho appena confronto sulla [p.BaseSku = 'KPK-3020QWC-C'] o [contengono (p.FreeTextStrings, '"KPK-3020QWC * "')] individualmente (ma non entrambi) il suo istante. E se li paragono insieme ci vogliono anni (diversi minuti) - e restituisce solo una riga.
IsEnabled e BaseSku sono indicizzati e FreeTextStrings è indicizzato FTS.
Ricordo che funzionava bene prima.
Qualcuno può far luce su questo e suggerire alcune soluzioni?
file del piano di esecuzione è disponibile qui: http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip
Puoi mostrarci un piano di esecuzione dal tuo SQL Server? –
Questi problemi si sono verificati dopo l'aggiornamento di SQL 2005 a SQL 2008. – Muxa