Mam problemy ze zrozumieniem zachowania planów szacunkowych zapytań dla mojego wyciągu w programie SQL Server w przypadku zmiany ze sparametryzowanego zapytania na sparametryzowane zapytanie.Różnice w planach zapytań SQL Server
mam zapytania:
DECLARE @p0 UniqueIdentifier = '1fc66e37-6eaf-4032-b374-e7b60fbd25ea'
SELECT [t5].[value2] AS [Date], [t5].[value] AS [New]
FROM (
SELECT COUNT(*) AS [value], [t4].[value] AS [value2]
FROM (
SELECT CONVERT(DATE, [t3].[ServerTime]) AS [value]
FROM (
SELECT [t0].[CookieID]
FROM [dbo].[Usage] AS [t0]
WHERE ([t0].[CookieID] IS NOT NULL) AND ([t0].[ProductID] = @p0)
GROUP BY [t0].[CookieID]
) AS [t1]
OUTER APPLY (
SELECT TOP (1) [t2].[ServerTime]
FROM [dbo].[Usage] AS [t2]
WHERE ((([t1].[CookieID] IS NULL) AND ([t2].[CookieID] IS NULL))
OR (([t1].[CookieID] IS NOT NULL) AND ([t2].[CookieID] IS NOT NULL)
AND ([t1].[CookieID] = [t2].[CookieID])))
AND ([t2].[CookieID] IS NOT NULL)
AND ([t2].[ProductID] = @p0)
ORDER BY [t2].[ServerTime]
) AS [t3]
) AS [t4]
GROUP BY [t4].[value]
) AS [t5]
ORDER BY [t5].[value2]
Zapytanie wytworzony przez ekspresję linq2sql i ekstrahowano z LINQPad. Tworzy to przyjemny plan kwerend (o ile mogę powiedzieć) i wykonuje się w około 10 sekund w bazie danych. Jeśli jednak zastąpię dwa zastosowania parametrów dokładną wartością, czyli zastąpię dwie części "= @ p0" za pomocą "=" 1fc66e37-6eaf-4032-b374-e7b60fbd25ea "" Otrzymuję inny szacowany plan zapytania i zapytanie działa teraz znacznie dłużej (ponad 60 sekund, nie widziałem tego).
Dlaczego wykonanie pozornie niewinnego zamiennika zapewnia znacznie mniej wydajny plan kwerend i wykonanie? Usunąłem pamięć podręczną procedur z "DBCC FreeProcCache", aby upewnić się, że nie buforowałem złego planu, ale zachowanie pozostaje.
Moim prawdziwym problemem jest to, że mogę żyć z 10-sekundowym czasem wykonania (przynajmniej na dobry moment), ale nie mogę żyć z czasem realizacji 60+ sekund. Moja kwerenda będzie (jak sugerował wyżej) przez produkowane przez linq2sql więc jest on wykonywany na bazie danych jako
exec sp_executesql N'
...
WHERE ([t0].[CookieID] IS NOT NULL) AND ([t0].[ProductID] = @p0)
...
AND ([t2].[ProductID] = @p0)
...
',N'@p0 uniqueidentifier',@p0='1FC66E37-6EAF-4032-B374-E7B60FBD25EA'
która produkuje ten sam czas wykonania słabe (co moim zdaniem jest podwójnie dziwne, ponieważ wydaje się być za pomocą sparametryzowanych kwerend.
ja nie szukam porad, na których indeksy stworzenia lub podobnego, po prostu próbuję zrozumieć, dlaczego plan kwerend i wykonanie są tak niepodobne na trzech pozornie podobnych zapytań
EDIT:. Przesłałem plany wykonania dla sparametryzowanych i zapytania parametryzowane a także plan wykonania dla zapytania parametrycznego (jako sugerowane przez Heinz) z innym GUID here
Nadzieję, że pomaga mi pomóc :)
Czy możesz opublikować plany zapytań, które otrzymujesz? Po prostu uruchom 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi
Zrobione ... Dodano łącze do planu wykonania ... –