Database
 sql >> Base de données >  >> RDS >> Database

Exemple d'amélioration des performances des requêtes avec des index

Dans cet article, nous verrons comment un index peut améliorer les performances des requêtes.

Présentation

Les index dans Oracle et d'autres bases de données sont des objets qui stockent des références à des données dans d'autres tables. Ils sont utilisés pour améliorer les performances de la requête, le plus souvent l'instruction SELECT.

Ils ne sont pas une "solution miracle" - ils ne résolvent pas toujours les problèmes de performances avec les instructions SELECT. Cependant, ils peuvent certainement vous aider.

Considérons cela sur un exemple particulier.

Exemple

Pour cet exemple, nous allons utiliser une seule table appelée Client qui contient des colonnes telles que l'ID, le prénom, le nom, la valeur maximale du crédit, la valeur de la date de création et d'autres colonnes que nous n'utiliserons pas.

SELECT customer_id,first_name,last_name, max_credit, created_date
FROM customer;

Voici un exemple du tableau.

[identifiant de table=38 /]

Maintenant, nous allons trouver ce qui suit :

  • Qui des clients a été ajouté au tableau à la même date avec les premiers clients
  • Clients filtrés par last_name dans un ordre croissant
  • Afficher l'ID client, le prénom, le nom, le crédit maximum et la date de création

Pour cela, créez la requête suivante :

SELECT customer_id,
first_name,
last_name,
max_credit,
created_date
FROM customer
WHERE created_date = (
     SELECT MIN(created_date)
     FROM customer
)
ORDER BY last_name;

La sortie ressemble à ceci :

[identifiant de table=39 /]

Il affiche les données que nous voulons.

Performances avant application de l'index

Examinons maintenant le plan d'explication de cette requête. J'ai obtenu ceci en exécutant EXPLAIN PLAN FOR pour l'instruction SELECT et la commande suivante :

SELECT * FROM TABLE(dbms_xplan.display);

Vous pouvez également obtenir un résultat de sortie similaire à l'aide de la fonction d'explication du plan dans votre IDE.

On peut voir qu'il effectue un Table Access Full en deux points, à savoir dans la sous-requête et dans la requête externe. C'est parce qu'il n'y a pas d'index sur la table à utiliser.

Il a un coût de 2934. Lorsque je l'ai exécuté, la requête a récupéré 785 lignes en 1,9 seconde. Cela peut sembler rapide, mais ce n'est qu'un exemple sur lequel nous pouvons nous améliorer. Les requêtes dans des systèmes réels peuvent prendre beaucoup plus de temps.

Une façon d'améliorer les performances de cette requête consiste à ajouter un index à la colonne created_date. Cette colonne est utilisée à la fois dans la clause WHERE de la requête externe et dans la fonction MIN de la requête interne.

Ajouter un index

Nous pouvons ajouter un index à cette table pour améliorer les performances de la requête. Cet index sera stocké dans la colonne created_date afin que le code ressemble à ceci :

CREATE INDEX idx_cust_cdate
ON customer (created_date);

Désormais, l'index est créé sur cette colonne uniquement. Cela devrait nous donner une amélioration des performances de notre requête, mais nous devrons d'abord le vérifier.

Nous avons créé un index b-tree, qui est probablement tout ce dont nous avons besoin sur cette colonne. Nous le confirmerons dans le plan d'explication sous peu. J'ai écrit un guide sur les index Oracle, y compris comment savoir quel type d'index utiliser, ainsi que de nombreuses autres informations précieuses.

Performance après index ajouté

Réexécutons le plan d'explication sur cette requête.

Nous pouvons voir qu'un index a été utilisé à la dernière étape. Il montre qu'un Full Scan a été exécuté avec l'index idx_cust_cdate, qui est celui que nous venons de créer.

Il affiche également un coût global de 1472 et récupère les 785 enregistrements en 0,9 seconde.

Le temps d'exécution ne s'est que légèrement amélioré (de 1,9 à 0,9 seconde), mais cela représente une amélioration d'environ 50 % simplement en ajoutant l'index à ce petit ensemble de données.

Comme mentionné précédemment, les vraies requêtes seront plus compliquées que celle-ci et leur exécution prendra plus de temps. Mais, ceci est un exemple de la façon dont un index peut améliorer le plan de requête et l'exécution de la requête.