У меня есть рекурсивный запрос, который выполняется очень быстро, если предложение WHERE
содержит константу, но становится очень медленным, если я заменяю константу параметром, имеющим то же значение.
Запрос # 1- с константой
;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
Запрос №2 - с параметром
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
В случае таблицы с 50000 строк выполняется запрос с константойв течение 10 миллисекунд, а параметр с параметром работает в течение 30 секунд (в 3000 раз медленнее).
Невозможно переместить последнее предложение WHERE
в определение привязки рекурсии, как мне хотелось быиспользовать запрос для создания представления (без последнего WHERE
).У выбора в представлении будет предложение WHERE
(WHERE Id = @Id
) - мне это нужно из-за Entity Framework, но это уже другая история.
Может кто-нибудь предложить способ форсировать запрос № 2 (с помощьюпараметр) использовать тот же план запроса, что и запрос № 1 (с константой)?
Я уже пробовал играть с индексами, но это не помогло.
Если кто-то захочет, я могу опубликоватьопределение таблицы и некоторые примеры данных.Я использую SQL 2008 R2.
Заранее благодарю за помощь!
План выполнения - Запрос № 1 - с постоянной
План выполнения - Запрос № 2 - с параметром