TME : Les Index

L'objectif de ce TP est de mettre en évidence l'utilisation des index pour améliorer le temps de réponse des requêtes. Lire l'annexe PlanRequete

Installer les fichiers du TME

Ouvrir une fenêtre de terminal (xterm), pour exécuter les commandes suivantes :

commande description
cd aller dans votre répertoire $HOME
tar zxvf $BD_TOOL/tp-index.tgz installer l'archive dans votre répertoire principal
cd tp-index aller dans votre répertoire de travail
emacs annuaire.sql & éditer le fichier
SQL> @annuaire exécute le script annuaire.sql depuis l'invite SQL

Exercice

1) (préparation) Créer une relation Annuaire(nom, prenom, age, cp, tel) en utilisant le fichier annuaire.sql.

SQL> @annuaire

Elle contient 10000 tuples sur 90 prénoms et 100 noms différents. Les codes postaux (cp) sont des multiples de 100 et sont compris entre 1000 et 100000. Le numéro de téléphone est une chaîne de 10 chiffres commencant par 0. Le numéro de téléphone est une clé de l'annuaire.

Répondre aux questions suivantes dans le fichier tme2.sql

2) Proposer une ou plusieurs requêtes pour vérifier si la distribution de l'attribut age est uniforme, quasi uniforme ou fortement biaisée. Expliquer brièvement comment analyser le résultat de cette requête.

3) Proposer une ou plusieurs requêtes pour vérifier que les attributs age et prénom sont indépendants :

4) En utilisant les formules du cours, estimer la cardinalité des requêtes suivantes. Comparer ensuite la cardinalité estimée avec la cardinalité réelle des requêtes. Quel est le pourcentage d'erreur (réel/théorique) ?

* R6: select count(*) from Annuaire where age < 65;

5) Créer les index mono-attributs permettant d'améliorer les performances des requêtes précedentes. La syntaxe est :

5.1) Afin de visualiser les informations détaillées sur le traitement des requêtes :

Pour chaque requête, afficher les index utilisés par le moteur de requête.

Présenter vos réponses dans un tableau récapitulatif :

requête index utilisé(s)
R1 ...
... ...

Analyser le tableau et suggérer des règles heuristiques que l'optimiseur utilise pour choisir un index. Si nécessaire, compléter le tableau avec d'autres requêtes.

5.2) Quelles sont les requêtes pour lesquelles le plan d'exécution construit par l'optimiseur ne vous semble pas optimal ? Donner un exemple.

6) Estimation du coût des accès. L'ordre ANALYZE ajoute des statistique dans le dictionnaire du SGBD pour permettre à l'optimiseur d'estimer le coût des requêtes :

6.1) En interrogant les vues user_tables, user_tab_columns et user_indexes, expliquer quelles sont les statistiques maintenues dans le dictionnaire. Désactiver le mode autotrace avant d'interroger les vues (set autrotrace off).

6.2) Afin que le SGBD maintienne des statistiques sur vos index, exécutez la commande suivante pour chaque index :

*On demande maintenant à l'optimiseur de requêtes d'utiliser un modèle de coût (et non pas des règles heuristiques) pour choisir un plan d'exécution efficace. La session est modifiées en conséquence : ** alter session set optimizer_mode = CHOOSE; Pour chaque requête, afficher les index utilisés par le moteur de requêtes. Expliquer pourquoi les index utilisés ne sont plus les mêmes qu'en 5.1)

6.2.1) En déduire la méthode que l'optimiseur utilise pour choisir un index.

6.2.2) Est ce l'optimiseur estime avec précision la cardinalité des requêtes ? Si non, expliquer pourquoi.

6.3) On veut déterminer à partir de quel facteur de sélectivité, l'optimiseur choisit la lecture séquentielle plutôt que l'accès par index. On appelle S le seuil du facteur de sélectivité au delà duquel la lecture séquentielle est utilisée de préférence à l'index. Combien vaut S ?

6.4) Quelles sont les requêtes pour lesquelles le plan d'exécution construit par l'optimiseur n'est pas optimal, donner un exemple.

7) (facultatif) Proposer une méthode pour mesurer la dégradation de performance due à l'index lors de l'insertion de données dans l'annuaire.


retour vers: LesTravauxDirigés, LesCours, l'Accueil.