Ho un proc memorizzato che cerca prodotti (250.000 righe) utilizzando un indice di testo completo.Perché le prestazioni di queste 2 query sono così diverse?
Il processo memorizzato prende un parametro che è la condizione di ricerca testo completo. Questo parametro può essere nullo, quindi ho aggiunto un controllo Null e la query ha iniziato improvvisamente a eseguire ordini di grandezza più lenti.
-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
Qui ci sono i piani di esecuzione:
Query # 1
Query # 2
Devo ammettere che io non sono molto familiare con i piani di esecuzione. L'unica differenza ovvia per me è che i join sono diversi. Vorrei provare ad aggiungere un suggerimento, ma non avendo aderire alla mia domanda non sono sicuro di come farlo.
Inoltre non capisco perché viene utilizzato l'indice denominato IX_SectionID, poiché si tratta di un indice che contiene solo la SectionID della colonna e che la colonna non è utilizzata in alcun luogo.
Nizza articolo - l'aggiunta di 'OPTION (RECOMPILE)' in realtà risolve il problema di prestazioni al 2 ° query (però un altro problema è che 'contains()' solleva un errore quando il parametro è NULL, ma questo è un altro problema). –