L`optimiseur ORACLE suit une approche classique: Génération d

Transcription

L`optimiseur ORACLE suit une approche classique: Génération d
L’optimiser ORACLE
L’optimiser ORACLE suit une approche classique:
Génération de plusieurs plans d’exécution.
Estimation du coût de chaque plan généré.
Choix du meilleur et exécution.
Tout ceci est automatique, mais il est possible d’influer, voire de
forcer le plan d’exécution.
1
Estimation du coût d’un plan d’exécution
Beaucoup de paramètres entrent dans l’estimation du
coût :
– Les chemins d’accès disponibles.
– Les opérations physiques de traitement des résultats
intermédiaires.
– Des statistiques sur les tables concernées (taille, sélectivité).
– Les statistiques sont calculées par appel explicite à l’outil
ANALYSE.
– Les ressources disponibles.
2
Règles
Priorité
• 1 Accès à un enregistrement par
ROWID
• 2 Accès à un enregistrement dans un
cluster
• 3 Accès à un enregistrement dans une
table de hachage (hash cluster )
• 4 Accès à un enregistrement par clé
unique (avec un index)
• ... ...
• 15
Balayage complet de la table
3
Principaux paramètres
• OPTIMIZER_MODE (RULE, CHOOSE, FIRST_ROW,
ALL_ROWS).
• SORT_AREA_SIZE (taille de la zone de tri).
• HASH_AREA_SIZE (taille de la zone de hachage).
• HASH_JOIN_ENABLED considère les jointures par hachage.
4
Création des statistiques
1. Calcul de la taille et du nombre de lignes :
ANALYSE TABLE Autos COMPUTE STATISTICS FOR
TABLE
3. Analyse des index :
ANALYSE TABLE Autos COMPUTE STATISTICS
FOR ALL INDEX
6. Analyse de la distribution des valeurs :
ANALYSE TABLE Autos COMPUTE STATISTICS FOR
COLUMNS serial, color, model
5
Les chemins d’accès
• Parcours séquentiel (FULL TABLE SCAN).
• Par adresse (ACCESS BY ROWID).
• Parcours de regroupement (CLUSTER SCAN).
On récupère alors dans une même lecture les n-uplets
des 2 tables du cluster.
• Recherche par hachage (HASH SCAN).
• Parcours d’index (INDEX SCAN).
6
Opérations physiques
• INTERSECTION : intersection de deux
ensembles de n-uplet.
• CONCATENATION : union de deux ensembles.
• FILTER : élimination de n-uplets (sélection).
• PROJECTION : opération de l’algèbre
relationnelle.
D’autres opérations sont liées aux algorithmes de
jointures.
7
Algorithmes de jointure
ORACLE utilise trois algorithmes de jointures :
• Tri/fusion quand il n’y a pas d’index. Opération
SORT et MERGE.
• Jointure par hachage quand il n’y a pas d’index.
Opération HASH JOIN
• Boucles imbriquées quand il y a au moins un
index. Opération NESTED LOOP.
8
L’outil TRACE
• L’outil TRACE donne le plan d’exécution et les coûts
d’exécution d’une requête.
• set timing on
• set autotrace trace
• La description comprend :
– Le chemin d’accès utilisé.
– Les opérations physiques (tri, fusion, intersection,
...).
– L’ordre des opérations.
• Il est représentable par un arbre.
9
Optimisation dans ORACLE
Autos ( serialNo, model, color)
Sales (serial, dealer, datesales, price)
Dealers (name, city, departement,
phone)
10
Sélection sans index
set timing on
set autotrace trace
select *
from autos
where model = 'Gobi' ;
Ecoulé : 00 :00 :00.02
Plan d'exécution
------------------------------------------------------------------------------------------------------------------------| Id | Operation
| Name | Rows | Bytes | Cost (%CPU)|
---------------------------------------------------------------| 0 | SELECT STATEMENT |
|
32 | 544 |
3 (0)|
|* 1 | TABLE ACCESS FULL | AUTOS |
32 | 544 |
3 (0)|
---------------------------------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------1 - filter("MODEL"='Gobi')
11
Plan d’exécution
PROJECTION
PARCOURSSEQUENTIEL
AUTOS
12
Sélection avec index
set timing on
set autotrace trace
select *
from dealers
where name = 'dealer1';
Ecoulé : 00 :00 :00.00
Plan d'exécution
---------------------------------------------------------------------------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)|
------------------------------------------------------------------------------| 0 | SELECT STATEMENT
|
|
1 | 38 |
1 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID | DEALERS
|
1 | 38 |
1 (0)|
|* 2 | INDEX UNIQUE SCAN
| PK_DEALERS |
1|
|
0 (0)|
------------------------------------------------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------2 - access("ID_DEALER"='dealer1')
13
Plan d’exécution
PROJECTION
ACCESDIRECT
TRAVERSÉEINDEX
Dealers
IndexDealers
14
Jointure avec index
Set timing on
Set autotrace trace
SELECT serialNo, model, color
FROM Autos A, Sales s
WHERE serial = serialNo;
Ecoulé : 00 :00 :00.01 Plan d'exécution
---------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost %CPU)|
-----------------------------------------------------------------------------| 0 | SELECT STATEMENT
|
| 236 | 5428 |
2 (0)|
| 1 | NESTED LOOPS
|
| 236 | 5428 |
2 (0)|
| 2 | INDEX FULL SCAN
| PK_SALES | 236 | 1416 |
1 (0)|
| 3 | TABLE ACCESS BY INDEX ROWID| AUTOS
| 1|
17 |
1 (0)|
|* 4 | INDEX UNIQUE SCAN
| PK_AUTOS | 1 |
|
0 (0)|
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------4 - access("SERIAL"="SERIALNO")
15
Plan d’exécution
PROJECTION
BOUCLEIMBRIQUEE
PARCOURSINDEX
IndexSales
ACCESDIRECT
RecherchePar
Clé
serial=serialN
o
IndexAutos
Autos
16
Jointure sans index
On force ici l’optimiseur à ne pas utiliser l’index de sales
et timing on
et autotrace trace
ELECT /*+ NO_INDEX(s) */ serialNo, model, color
ROM
Autos
Ecoulé
: 00 :00
:00.04A,
Sales s
Plan d'exécution
HERE serial = serialNo;
---------------------------------------------------------------------------------------------------------------------------------| Id | Operation
| Name
| Rows| Bytes | Cost |
------------------------------------------------------------------------| 0 | SELECT STATEMENT
|
| 236 | 5428 | 4 |
| 1 | NESTED LOOPS
|
| 236 | 5428 | 4 |
| 2 | TABLE ACCESS FULL
| SALES
| 236 | 1416 | 3 |
| 3 | TABLE ACCESS BY INDEX ROWID | AUTOS | 1 |
17 | 1 |
| 4 | INDEX UNIQUE SCAN
| PK_AUTOS | 1 |
| 0|
-------------------------------------------------------------------------
17
Plan d’exécution
PROJECTION
BOUCLEIMBRIQUEE
ACCESDIRECT
PARCOURSSEQUENTIEL
Sales
RecherchePar
Clé
serial=serialN
o
IndexAutos
Autos
18
Jointure sans index
On force ici l’optimiseur à ne pas utiliser les index
et timing on
et autotrace trace
ELECT /*+ NO_INDEX(s) NO_INDEX(A)*/ serialNo, model, color
Ecoulé : 00 :00 :00.02
ROM Autos A, Sales s
Plan d'exécution
HERE serial = serialNo;
--------------------------------------------------------------------------------------------------------------------| Id | Operation
| Name | Rows | Bytes | Cost |
-----------------------------------------------------------| 0 | SELECT STATEMENT |
| 236 | 5428 | 7 |
| 1 | HASH JOIN
|
| 236 | 5428 | 7 |
| 2 | TABLE ACCESS FULL| AUTOS | 236 | 4012 | 3 |
| 3 | TABLE ACCESS FULL| SALES | 236 | 1416 | 3 |
-----------------------------------------------------------19
Plan d’exécution
PROJECTION
HashJoin
PARCOURSSEQUENTIEL
Sales
PARCOURSSEQUENTIEL
Autos
20