Wir versuchen, einige unserer Abfragen zu optimieren.
Eine Abfrage macht folgendes:
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, () Datum,
INTO [#Gadget]
FROM task t
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID) as Client
FROM [#Gadget]
order by CASE WHEN Datum IS NULL THEN 1 ELSE 0 END , Datum ASC
DROP TABLE [#Gadget]
(Ich habe die komplexe Unterabfrage entfernt. Ich denke nicht, dass sie relevant ist, außer um zu erklären, warum diese Abfrage als zweistufiger Prozess durchgeführt wurde.)
Ich dachte, es wäre effizienter, dies in eine einzelne Abfrage mit Unterabfragen zu kombinieren:
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID)
FROM
(
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, () Datum,
FROM task t
) as sub
order by CASE WHEN Datum IS NULL THEN 1 ELSE 0 END , Datum ASC
Dies würde dem Optimierer bessere Informationen zur Verfügung stellen, um herauszufinden, was passiert und temporäre Tabellen zu vermeiden. Ich ging davon aus, dass es schneller sein sollte.
Aber es stellt sich heraus, dass es viel langsamer ist. 8 Sekunden gegen unter 5 Sekunden.
Ich kann nicht herausfinden, warum das so ist, da mein gesamtes Wissen über Datenbanken darauf hindeutet, dass Unterabfragen immer schneller sein sollten als die Verwendung von temporären Tabellen.
Was übersehe ich?
Bearbeiten --
Soweit ich aus den Abfrageplänen sehen konnte, sind beide weitgehend identisch, bis auf die temporäre Tabelle, die einen zusätzlichen "Table Insert" Vorgang mit einem Anteil von 18% hat.
Offensichtlich ist aufgrund der beiden Abfragen der Kosten für das Sortieren obersten N viel höher in der zweiten Abfrage als die Kosten des Sortierens im Unterabfrage-Verfahren, daher ist es schwierig, einen direkten Vergleich der Kosten anzustellen.
Alles, was ich aus den Plänen sehen kann, würde darauf hindeuten, dass das Unterabfrage-Verfahren schneller sein sollte.