Comparer l'exécution d'une requête avec 2 index différents

Les performances sont un terme un peu à la mode, mais derrière ce mot se cache généralement une part de mystère, c'est pourquoi il faut chiffrer ses objectifs ; on peut agir sur différents éléments, même si généralement (surtout pour les traitements applicatifs qui ne sont pas les batch de nuit par exemple), c'est bien le temps de réponse qui nous intéresse. Voici les critères à prendre en compte :
- temps de réponses : en régime de croisière, quid du premier utilisateur lorsque les bases ont redémarrées la nuit ?
- montée en charge : stabilité du temps de réponse jusqu'à x utilisateurs, tout s'écroule ensuite ou bien si un nombre important d'utilisateur, les temps sont moins bons mais le service est assuré.
- accès disque (lié au temps de réponse car ils sont généralement le goulet d'étranglement)
- consommation CPU (si pas machine dédiée)
- consommation mémoire (si pas machine dédiée)

Il faut bien se rappeler que la performance ne peut être définie sans son contexte : le disque, la mémoire, les CPU, le réseau sont autant d'éléments qui entre en compte lors d'une mesure de performance. Ainsi, performance n'a de sens que lorsqu'il est pluriel : on parle alors de benchmark : performance après migration de 9i en 10g ; performance après une migration de données d'un tablespace à l'autre, performance après ajout de RAM, ...

Les différents niveaux d'intervention sont utile. Lorsqu'une application est globalement rapide, si une requête est lente, on va donc se concentrer sur celle-ci. Ainsi, l'exemple ci-après nous indiquera les temps d'exécution selon l'utilisation de l'un ou l'autre index (voir l'utilisation des hints).
Par exemple :

set serveroutput on;
declare
var1 number;
var2 number;
begin
select /*+ index (t1 ix1) */ col1 into var1 from t1 where col2 = 12 and rownum=1;
select /*+ index (t1 ix2) */ col1 into var2 from t1 where col2 = 12 and rownum=1;

dbms_output.put_line('Début : ' || systimestamp);
for i in 1..10000 loop
select /*+ index (t1 ix1) */ col1 into var1 from t1 where col2 = 12 and rownum=1;
end loop;
dbms_output.put_line('2eme solution : ' || systimestamp);
for i in 1..10000 loop
select /*+ index (t1 ix2) */ col1 into var2 from t1 where col2 = 12 and rownum=1;
end loop;
dbms_output.put_line('Fin : ' || systimestamp);
end;
/


Voir aussi:
- Index
- Hint oracle et choix du plan d'exécution
- Améliorer les performances d'une vue
- Pourquoi mon index n'est pas utilisé ?
- Les statistiques Oracle




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories