Meervoudige sortering is een essentieel instrument bij het opstellen van rapporten, wanneer gegevens moeten worden gerangschikt of gegroepeerd op meerdere kolommen (bijvoorbeeld eerst op datum, dan op naam, dan op totaalbedrag). Traditioneel werd sorteren strikt op één veld toegepast, wat niet de behoeften van complexe gegevensanalyse oplost.
Het probleem ligt vaak in de onjuiste sorteervolgorde (bijvoorbeeld dat NULL-waarden op onverwachte plaatsen verschijnen), collatiererrors (verschillende taalkundige sorteervregels voor stringwaarden) en prestatiedips bij grote gegevenssets.
Oplossing: Gebruik een meervoudige ORDER BY, houd rekening met de specificiteit van COLLATION en definieer expliciet de volgorde van NULLS voor determinisme van het resultaat, en controleer ook op indexering van kolommen voor grote tabellen.
Voorbeeldcode:
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Belangrijke kenmerken:
Als COLLATE niet is opgegeven, is de sortering dan altijd hetzelfde op verschillende servers?
Nee! COLLATE is afhankelijk van de instellingen van de database en/of server, en de sorteerresultaten van strings (vooral met Cyrillisch, speciale tekens) kunnen verschillen tussen installaties.
Waar komen NULL in terecht bij DESC en ASC sortering?
De SQL-standaard definieert dit niet eenduidig. In sommige DBMS komen NULL bovenaan bij ASC, in andere onderaan. Geef expliciet NULLS FIRST of NULLS LAST op om de werking transparant te maken.
ORDER BY price DESC NULLS LAST
Heeft ORDER BY op meerdere kolommen invloed op het gebruik van een index?
Ja, maar alleen als de volgorde, types en netheid van de waarden van de kolommen overeenkomen met de bestaande samengestelde index. Als de volgorde gemengd is (ASC/DESC) of berekende velden worden gebruikt, kan de index niet worden gebruikt.
De manager maakte een rapport met ORDER BY op achternaam zonder COLLATE. Bij het overdragen van het rapport tussen verschillende servers verwisselden Russische en Latijnse achternamen plaatsen, en NULL bevond zich soms aan het begin en soms aan het einde.
Voordelen:
In het rapport werd expliciet COLLATE en de volgorde van NULL via NULLS FIRST/LAST ingesteld, en een samengestelde index op de sorteervelden toegevoegd. Het gedrag stopte met afhankelijk zijn van de omgeving, de snelheid van de query nam aanzienlijk toe.
Voordelen: