Trier est une opération très intensive pour les processeurs. Cependant, le problème principal est que la base de données doit placer temporairement les résultats dans un tampon. Une opération de tri doit lire toutes les données avant de pouvoir renvoyer la première ligne. Les opérations de tri ne peuvent pas être exécutées dans un pipeline, ce qui devient un problème pour les gros ensembles de données.
Un index fournit une représentation ordonnée des données indexées : ce
principe a déjà été décrit dans le Chapitre 1. En fait, un index enregistre les données
en les pré-triant. L'index est trié comme si nous avions utilisé une clause
order by
dans la définition de l'index. Il n'est donc pas
surprenant que nous puissions utiliser les index pour éviter l'opération de
tri tout en satisfaisant la clause order by
.
De façon assez ironique, une opération INDEX RANGE SCAN
devient elle-aussi inefficace pour de gros volumes de données, tout
spécialement si elle est suivie d'un accès à la table. Ceci peut annuler le
gain obtenu en évitant l'opération de tri. Un FULL TABLE SCAN
avec une
opération de tri explicite pourrait même être plus rapide dans ce cas.
Encore une fois, c'est à l'optimiseur d'évaluer les différents plans
d'exécution et de sélectionner le meilleur.
Une exécution d'un order by
via un index ne permet
pas seulement de gagner sur l'effort de tri. Il est aussi capable de
renvoyer les premiers résultats sans traiter les données en entrée.
L'order by
peut donc être exécuté dans un pipeline. Le
Chapitre 7, « Résultats partiels » explique comment exploiter l'exécution en
pipeline pour implémenter des requêtes efficaces de pagination. Une
exécution en pipeline d'un order by
est si importante que
j'y vois la troisième puissance de l'indexation.
Remarque
Le parcours d'un B-Tree est la première puissance de l'indexation.
Le regroupement est la deuxième puissance de l'indexation.
L'exécution en pipeline d'un order by
est la
troisième puissance de l'indexation.
Ce chapitre explique comment utiliser un index pour l'exécution d'un
order by
en pipeline. Pour cela, nous allons faire
particulièrement attention aux interactions avec la clause
where
ainsi qu'aux modificateurs ASC
et
DESC
. Le chapitre conclut sur l'application de ces techniques à
la clause group by
.