Sortowanie wielokolumnowe — kluczowe narzędzie przy tworzeniu raportów, gdy konieczne jest uporządkowanie lub grupowanie danych według kilku kolumn (na przykład najpierw według daty, potem według nazwy, następnie według sumy). Tradycyjnie sortowanie było stosowane ściśle według jednego pola, co nie rozwiązuje problematyki złożonej analizy danych.
Problem często polega na niewłaściwej kolejności sortowania (na przykład wartości NULL znajdują się w nieoczekiwanych miejscach), błędach kolacji (różne zasady sortowania dla stringów) oraz spadkach wydajności przy dużych zestawach danych.
Rozwiązanie: Użyj wielokolumnowego ORDER BY, uwzględnij specyfikę COLLATION oraz wyraźnie zdefiniuj kolejność NULLS, aby określić wynik, a także sprawdź indeksację kolumn dla dużych tabel.
Przykład kodu:
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Kluczowe cechy:
Czy jeśli nie określisz COLLATE, sortowanie zawsze będzie takie samo na różnych serwerach?
Nie! COLLATE domyślne zależą od ustawień bazy i/lub serwera, a wyniki sortowania stringów (szczególnie z cyrylicą, znakami specjalnymi) mogą się różnić między instalacjami.
Gdzie umieszczane są NULL przy sortowaniu DESC i ASC?
Standard SQL nie definiuje tego jednoznacznie. W niektórych DBMS NULL są na górze przy ASC, w innych — na dole. Wyraźnie wskazuj NULLS FIRST lub NULLS LAST, aby zachować przejrzystość działania.
ORDER BY price DESC NULLS LAST
Czy ORDER BY według kilku kolumn wpływa na użycie indeksu?
Tak, ale tylko jeśli kolejność, typy i czystość wartości kolumn odpowiadają istniejącemu indeksowi kompozytowemu. Jeśli kolejność jest mieszana (ASC/DESC) lub używane są pola obliczeniowe, indeks może nie być użyty.
Menadżer stworzył raport z ORDER BY według nazwiska bez COLLATE. Po przeniesieniu raportu między różnymi serwerami rosyjskie i łacińskie nazwiska zamieniały się miejscami, a NULL były to na początku, to na końcu.
Zalety:
W raporcie wyraźnie określono COLLATE i kolejność NULL przez NULLS FIRST/LAST, dodano indeks kompozytowy na pola sortowania. Zachowanie przestało zależeć od środowiska, a szybkość zapytania znacznie wzrosła.
Zalety: