Staramy się zoptymalizować niektóre z naszych zapytań.Dlaczego użycie tabeli tymczasowej będzie szybsze niż zapytanie zagnieżdżone?
Jedno zapytanie jest w następujący sposób:
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
INTO [#Gadget]
FROM task t
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID) as Client
FROM [#Gadget]
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC
DROP TABLE [#Gadget]
(usunąłem złożoną podzapytanie nie sądzę, że to istotne, inne niż wyjaśnić dlaczego ta kwerenda została wykonana jako proces dwustopniowy.).
I myślał byłoby znacznie bardziej efektywne, aby połączyć to w dół w jednym zapytaniu za pomocą podzapytania jako:
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID)
FROM
(
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
FROM task t
) as sub
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC
Zapewni to optymalizatorowi lepsze informacje, aby ustalić, co się dzieje i uniknąć tabel tymczasowych. Zakładałem, że powinno być szybciej.
Ale okazuje się, że jest o wiele wolniej. 8 sekund vs. poniżej 5 sekund.
Nie mogę zrozumieć, dlaczego tak się stało, ponieważ cała moja wiedza na temat baz danych oznacza, że podzapytania zawsze będą szybsze niż używanie tabel tymczasowych.
Czego mi brakuje?
Edit -
Z tego co udało mi się zobaczyć z planów zapytań, oba są w dużej mierze identyczne, z wyjątkiem tabeli tymczasowej, która ma dodatkowy „Tabela Wstaw” działanie z kosztem 18 %.
Oczywiście, ponieważ ma dwa zapytania, koszt Sort Top N jest o wiele wyższy w drugim zapytaniu niż koszt sortowania w metodzie podzapytania, więc trudno jest dokonać bezpośredniego porównania kosztów.
Wszystko, co widzę z planów, oznaczałoby, że metoda podzapytania byłaby szybsza.
Czy porównywałeś plany kwerend? – Oded
@Oded, zobacz moją edycję. –
Czy wyczyściłeś pamięć podręczną danych między poszczególnymi testami? Jeśli nie, to może skończyć się twoim porównaniem – AdaTheDev