2010-04-11 5 views
10

Mam dość złożoną (lub brzydką w zależności od tego, jak na nią patrzysz) procedura składowana uruchomiona na SQL Server 2008. Opiera ona wiele logiki na widoku, który ma tabelę pk i tabelę fk. Stół fk jest połączony z tabelą pk nieco ponad 30 razy (tabela fk ma słabą konstrukcję - używa par wartości nazw, które muszę spłaszczyć, niestety, jest to trzecia strona i nie mogę jej zmienić).Generowanie planu zapytań SQL trwa 5 minut, samo zapytanie działa w milisekundach. Co tam?

W każdym razie działało dobrze przez kilka tygodni, aż okresowo zauważyłem bieg, który potrwałby 3-5 minut. Okazuje się, że czas na wygenerowanie planu zapytania. Gdy plan kwerendy istnieje i jest buforowany, sama procedura składowana działa bardzo wydajnie. Sprawy przebiegają sprawnie, dopóki nie pojawi się powód ponownego wygenerowania planu kwerend i buforowania go ponownie.

Czy ktoś to widział? Dlaczego wygenerowanie planu trwa tak długo? Czy istnieją sposoby, aby szybciej opracować plan?

Odpowiedz

3

Możesz spróbować użyć urządzenia Plan Guide. Generowanie planu będzie nadal trwało jakiś czas, ale powinno być znacznie krótsze.

2

Czy rozważałeś przepisanie swojego 30-złączonego SELECT na coś podobnego?

SELECT [key], NULL AS [a], NULL AS [b] 
    INTO #temp 
    FROM [pk-table] 

UPDATE t SET t.[a] = fk.[a], t.[b] = fk.[b] 
    FROM #temp t 
    INNER JOIN (
    SELECT f.[key], 
     MAX(CASE WHEN f.[name] = 'a' THEN f.[value] ELSE NULL END) AS [a], 
     MAX(CASE WHEN f.[name] = 'b' THEN f.[value] ELSE NULL END) AS [b] 
    FROM [fk-table] f 
    GROUP BY f.[key] 
    ) fk ON (fk.[key] = t.[key] 

Mimo to nie może być odpowiedzią na pytanie oryginalnego :)

+0

To też jest warte strzału. Chociaż próbowałem PIVOT i niektóre CTE i jak dotąd lewe sprzężenia jako widok były najbardziej wydajne. Czy widziałeś wcześniej, że byłeś szybszy? – TheEmirOfGroofunkistan

+0

Tak. Miałem taką samą logikę (wielokrotne (około 20) lewostronne sprzężenie "tabeli-fk" z jednym "tabelą-wzorcem"), a czas wykonania radykalnie wzrósł po dodaniu kolejnego sprzężenia z tej samej tabeli. Przepisanie tej olbrzymiej - jednej - do dwuetapowej-aktualizacji-aktualizacji naprawdę pomogło. Ale może to był tylko szczególny przypadek niefortunnych indeksów, nie chciałem kopać. (I przepraszam, brakowało "w widoku" w twoim poście) –

+0

np - widok sprawia, że ​​ponowne użycie zapytania jest prostsze, nie jestem pewien, czy jest to konieczne. – TheEmirOfGroofunkistan

2

coś się spowodowały plan wymaga rekompilacji takich jak aktualizacji statystyki lub zmiany DDL. Lista, jeśli tutaj: Execution Plan Caching and Reuse

Zapytanie w aktualnej formie zawsze będzie trwało 3-5 minut, aby dokonać rekompilacji: nie można tego uniknąć.

Zakładając, że nie możesz go zmienić (PIVOT, użyj wyzwalacza, aby utrzymać "prawidłową" tabelę itp.), Możesz kontrolować tylko wtedy, gdy nastąpi ponowna kompilacja.

Odpowiedź Remusa na plan przewodnika jest jednym ze sposobów. Patrzę również na moją statystykę utrzymania i zapewniam, że zrobi się to z dnia na dzień, powiedzmy, więc zdarza się to tylko raz na początku dnia

+0

Dzięki. Staram się unikać korzystania z przewodnika po planie, chyba że naprawdę muszę. Wymuszanie statystyk przez noc jest dobrym rozwiązaniem. Pomyśleliśmy też o próbach użycia wyzwalaczy. Nie mamy dobrego wyobrażenia o rzeczywistym obciążeniu stołu, ponieważ nie jest to jeszcze system na żywo.Ale chciałbym to wypróbować. – TheEmirOfGroofunkistan

Powiązane problemy