Mehrfache Sortierung ist ein wichtiges Werkzeug bei der Erstellung von Berichten, wenn es erforderlich ist, Daten nach mehreren Spalten zu priorisieren oder zu gruppieren (zum Beispiel zuerst nach Datum, dann nach Name, dann nach Betrag). Traditionell wurde die Sortierung strikt nach einem Feld angewendet, was die Aufgaben der umfassenden Datenanalyse nicht löst.
Das Problem besteht häufig in einer ungenauen Sortierreihenfolge (zum Beispiel erscheinen NULL-Werte an unerwarteten Stellen), Fehlern in der Collation (verschiedene sprachliche Regeln zur Sortierung von Zeichenfolgen) und Leistungseinbußen bei großen Datensätzen.
Lösung: Verwenden Sie die mehrspaltige ORDER BY-Klausel, berücksichtigen Sie die spezifische COLLATION und definieren Sie die Reihenfolge von NULLS ausdrücklich für die Determinierung des Ergebnisses sowie überprüfen Sie die Indizierung von Spalten für große Tabellen.
Beispielcode:
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Wichtige Merkmale:
Wenn COLLATE nicht angegeben ist, wird die Sortierung immer gleich auf verschiedenen Servern sein?
Nein! Die Standard-COLLATE hängt von den Einstellungen der Datenbank und/oder des Servers ab, und die Sortierungsergebnisse von Zeichenfolgen (insbesondere mit Kyrillisch, Sonderzeichen) können zwischen Installationen variieren.
Wo plazieren sich NULL bei der Sortierung ASC und DESC?
Der SQL-Standard definiert dies nicht eindeutig. In einigen DBMS gehen NULL nach oben bei ASC, in anderen nach unten. Geben Sie ausdrücklich NULLS FIRST oder NULLS LAST an, um das Verhalten transparent zu machen.
ORDER BY price DESC NULLS LAST
Beeinflusst ORDER BY nach mehreren Spalten die Verwendung des Index?
Ja, aber nur, wenn Reihenfolge, Typen und Sauberkeit der Spaltenwerte dem vorhandenen zusammengesetzten Index entsprechen. Wenn die Reihenfolge gemischt ist (ASC/DESC) oder berechnete Felder verwendet werden, kann der Index möglicherweise nicht genutzt werden.
Der Manager erstellte einen Bericht mit ORDER BY nach Nachname ohne COLLATE. Beim Übertragen des Berichts zwischen verschiedenen Servern wechselten russische und lateinische Nachnamen die Plätze, und NULLs waren mal am Anfang, mal am Ende.
Vorteile:
Im Bericht wurde COLLATE und die Reihenfolge von NULL ausdrücklich über NULLS FIRST/LAST festgelegt, und es wurde ein zusammengesetzter Index für die Sortierspalten hinzugefügt. Das Verhalten hörte auf, von der Umgebung abhängig zu sein, die Abfragegeschwindigkeit stieg erheblich an.
Vorteile: