Verwendung von ORDER BY in Views (Sichten) – Teil 2 – Erzwingen einer Sortierung

Im ersten Teil haben wir gesehen, dass die Verwendung von ORDER BY in Views nicht gestattet ist. Aber es gibt eine Reihe von Ausnahmen, wie wir auch schon an der Fehlermeldung erkennen können:
Nachricht 1033, Stufe 15, Status 1, Prozedur vwProd, Zeile 4 [Batchstartzeile 0]
Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken nur dann gültig, wenn auch TOP, OFFSET oder FROM XML angegeben wird.

Wir können also die TOP-Klausel mit der ORDER BY-Klausel in einem View verwenden.

Und manchmal kommt ein Kollege und sagt: „Mein Anwendungsprogramm lässt aber die Verwendung einer ORDER BY-Klausel nicht zu!“
Das ist genau der Moment, an dem wir die TOP-Klausel nutzen können. Die TOP-Klausel schränkt das Ergebnis bekanntermaßen auf die ersten x Zeilen ein. Aber der Kollege möchte keine Einschränkung der Daten und trotzdem eine Sortierung? Naja, da hätten wir einen Ansatz für: TOP in Verbindung mit Percent. Beispiel:

CREATE OR ALTER VIEW vwProd AS
SELECT TOP (100) PERCENT ProductName, UnitPrice
FROM Products
ORDER BY ProductName

Aber (OWEH!) die Daten sind bei der Benutzung des Views überhaupt nicht sortiert!
Das liegt daran, dass der SQL Server diese Sortierung einfach ignoriert. Das kann man auch sehr gut an dem Ausführungsplan zu einer Abfrage sehen. Nehmen wir an, wir haben folgende Abfrage:

SELECT ProductName, UnitPrice
FROM vwProd

Dann produziert das folgenden Ausführungsplan:

Die Sortierung taucht also gar nicht auf. Was ist, wenn ich aber doch eine Sortierung in den View einbinden möchte? Dann gibt es nur die Lösung, eine konkrete Zahl in der TOP-Klausel anzugeben. Beispiel:

CREATE OR ALTER VIEW vwProd AS
SELECT TOP (2147483647) ProductName, UnitPrice
FROM Products
ORDER BY ProductName

Führt man jetzt das oben angegebene Select nochmals aus, dann liefert das folgenden Ausführungsplan:

Wie der Ausführungsplan zeigt (und wie wir auch an den Resultaten der Abfrage erkennen) wird jetzt eine Sortierung tatsächlich durchgeführt. Die angegebene Zahl in der Top-Klausel ist die größte Zahl von Datentyp int. Das sind zwei Milliarden Zeilen. Eine Menge, die kaum eine Abfrage liefern wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert