Tri multiple — un outil essentiel lors de la création de rapports, lorsque des données doivent être classées ou regroupées par plusieurs colonnes (par exemple, d'abord par date, ensuite par nom, puis par montant). Traditionnellement, le tri était appliqué strictement sur un seul champ, ce qui ne répondait pas aux besoins d'une analyse complexe des données.
Le problème réside souvent dans un ordre de tri incorrect (par exemple, les valeurs NULL se retrouvent à des endroits inattendus), des erreurs de collation (différentes règles linguistiques pour trier des valeurs de chaîne) et des baisses de performance sur de grands ensembles de données.
Solution : Utiliser l'ORDER BY multi-colonnes, tenir compte de la spécificité de la COLLATION et définir explicitement l'ordre des NULLS pour la détermination du résultat, et vérifier l'indexation des colonnes pour les grandes tables.
Exemple de code :
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Caractéristiques clés :
Si COLLATE n'est pas spécifié, le tri sera-t-il toujours identique sur différents serveurs ?
Non ! Le COLLATE par défaut dépend des paramètres de la base et/ou du serveur, et les résultats du tri des chaînes (en particulier avec cyrillique, caractères spéciaux) peuvent varier entre les installations.
Où vont les NULL lors d'un tri DESC et ASC ?
La norme SQL ne le définit pas de manière explicite. Dans certaines SGBD, les NULL vont en haut lors de l'ASC, dans d'autres — en bas. Indiquez explicitement NULLS FIRST ou NULLS LAST pour que le comportement soit transparent.
ORDER BY price DESC NULLS LAST
L'ORDER BY sur plusieurs colonnes affecte-t-il l'utilisation de l'index ?
Oui, mais seulement si l'ordre, les types et la pureté des valeurs des colonnes correspondent à l'index composite existant. Si l'ordre est mélangé (ASC/DESC) ou si des champs calculés sont utilisés, l'index peut ne pas être utilisé.
Un manager a créé un rapport avec ORDER BY sur le nom de famille sans COLLATE. Lors du transfert du rapport entre différents serveurs, les noms de famille russes et latins échangeaient leur place, et les NULL se retrouvaient tantôt au début, tantôt à la fin.
Avantages :
Dans le rapport, la COLLATE et l'ordre des NULL ont été spécifiés via NULLS FIRST/LAST, et un index composite a été ajouté sur les colonnes de tri. Le comportement a cessé de dépendre de l'environnement, la vitesse de la requête a considérablement augmenté.
Avantages :