Ho una query ricorsiva che viene eseguita molto velocemente se la clausola WHERE
contiene una costante ma diventa molto lenta se sostituisco la costante con un parametro con lo stesso valore.Perché una query rallenta drasticamente se nella clausola WHERE una costante viene sostituita da un parametro (con lo stesso valore)?
Domanda # 1 - con la costante
;WITH Hierarchy (Id, ParentId, Data, Depth)
AS
(SELECT Id, ParentId, NULL AS Data, 0 AS Depth
FROM Test
UNION ALL
SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
FROM Hierarchy h
INNER JOIN Test t ON t.Id = h.ParentId
)
SELECT *
FROM Hierarchy
WHERE Id = 69
Query # 2 - con il parametro
DECLARE @Id INT
SELECT @Id = 69
;WITH Hierarchy (Id, ParentId, Data, Depth)
AS
(SELECT Id, ParentId, NULL AS Data, 0 AS Depth
FROM Test
UNION ALL
SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
FROM Hierarchy h
INNER JOIN Test t ON t.Id = h.ParentId
)
SELECT *
FROM Hierarchy
WHERE Id = @Id
In caso di una tabella con 50.000 righe la query con le piste costanti per 10 millisecondi e quello con il parametro funziona per 30 secondi (3000 volte più lento).
Non è un'opzione per spostare l'ultima clausola WHERE
alla definizione di ancoraggio della ricorsione, poiché desidero utilizzare la query per creare una vista (senza l'ultimo WHERE
). La selezione dalla vista avrebbe la clausola WHERE
(WHERE Id = @Id
) - Ne ho bisogno a causa di Entity Framework, ma questa è un'altra storia.
Qualcuno può suggerire un modo per forzare la query n. 2 (con il parametro) per utilizzare lo stesso piano di query della query n. 1 (con la costante)?
Ho già provato a giocare con gli indici, ma questo non ha aiutato.
Se qualcuno vorrebbe poter pubblicare la definizione della tabella e alcuni dati di esempio. Sto usando SQL 2008 R2.
Grazie per il vostro aiuto in anticipo!
esecuzione del piano - Domanda # 1 - con la costante
esecuzione del piano - Query # 2 - con il parametro
Piani di esecuzione post. – Donnie
Si prega di controllare i piani di esecuzione appena aggiunti. – Zoltan
Sembra che il buon piano spinga il predicato molto più in basso. Simile al problema discusso nella seconda parte di questo articolo http://jahaines.blogspot.com/2010/03/performance-tuning-101-what-you-will_17.html –