par Guillaume Lelarge.

Trier et grouper


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 . 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.

Contenu

  1. « Order By » indexé — interactions de la clause where

  2. ASC/DESC et NULL FIRST/LAST — changer l'ordre de l'index

  3. « Group By » indexé — Envoyer les données dans group by

Section précédenteSection suivante

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

Livre de Markus

Couverture du livre « SQL : Au cœur des performances »

L'essence de SQL tuning dans 200 pages.

Acheter de Markus
(Livre de poche et PDF)

Achetez chez Amazon
(Seulement en poche)

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license