Optimisation
Optimisation
données
Oracle stocke les données logiquement dans les tablespaces et
physiquement dans les fichiers de données.
– Un tablespace :
• ne peut appartenir qu’à une seule base de données à la
fois,
• est composé d’un ou de plusieurs fichiers de données,
• est divisé en unités logiques de stockage.
– Un fichier de données : Base de données
8 -2
Tablespace temporaire
8 -3
Le tablespace est une unité logique de stockage composée de fichiers de données
8 -4
Obtenir des informations
sur les tablespaces
Vous pouvez obtenir des informations sur les
tablespaces et les fichiers de données en interrogeant les
éléments suivants :
Tablespaces :
DBA_TABLESPACES
V$TABLESPACE
Informations sur le fichier de données :
DBA_DATA_FILES
V$DATAFILE
Informations sur les fichiers temporaires :
DBA_TEMP_FILES
V$TEMPFILE
8 -5
Créer des tablespaces
Un tablespace est créé à l'aide de la commande : CREATE TABLESPACE
drop tablespace OTR including contents and datafiles cascade constraints
/
CREATE TABLESPACE OTR
DATAFILE 'D:\ORACLE\DATA\oradata\DB11G\OTR.DBF '
SIZE 100M
AUTOEXTEND ON NEXT 5M MAXSIZE 200M;
8 -6
Création d’un tablespace
select substr(f.TABLESPACE_NAME,1,30),substr(f.FILE_NAME,1,60)
from dba_data_files f
order by f.TABLESPACE_NAME
/ 8 -7
Création d’un compte utilisateur
Création d’un utilisateur
8 -8
Consultation d’un compte
select distinct(u.TABLESPACE_NAME) from user_tables u;
8 -9
Creation d’une base
Voir fichier D:\cours_nejib\cours_tuning\debutant\base_otr.sql
8 -10
Consultation de la base
select u.TABLE_NAME,u.TABLESPACE_NAME from user_tables u
8 -11
Consultation des indexes
select i.TABLE_NAME,i.INDEX_NAME,i.TABLESPACE_NAME from user_indexes i
order by i.TABLE_NAME
8 -12
INDEXES SOUS ORACLE
8 -13
8 -14
8 -15
8 -16
Index
… WHERE key = 22
Pointeur
Clé de ligne
22
22
Index Table
8 -17
8 -18
8 -19
Le rôle d’un indexe dans le parcours d’une table
8 -20
8 -21
8 -22
Creation des nouveaux tablespaces
(D:\cours_nejib\cours_tuning\debutant\tablespace_volume.sql)
8 -23
8 -24
Creation d’un nouveau compte
(D:\cours_nejib\cours_tuning\debutant\creation_compte_volume)
/*****sous system **************************/
drop user VOLUME cascade
/
create user VOLUME identified by VOLUME default tablespace VOLUME
temporary tablespace TEMP
/
grant connect,resource to VOLUME
/
8 -25
Creation d’une base de données pour le compte volume
(D:\cours_nejib\cours_tuning\debutant\base_volume)
select u.USERNAME,u.DEFAULT_TABLESPACE,u.TEMPORARY_TABLESPACE
from user_users u;
8 -26
Consultation de la base
select u.TABLE_NAME,u.TABLESPACE_NAME from user_tables u
8 -27
Les règles
Insertion SQLpour
des donées d’optimisation
le compte volume
(D:\cours_nejib\cours_tuning\debutant\creation_volume.sql)
8 -28
Les indexes implicites crées par Oracle
Un index est créé automatiquement lors de la création de
la clé primaire ou unique dans une table
8 -29
Opérations
Les règles SQLd'optimisation
d’optimisation
8 -30
Les règles SQL d’optimisation
8 -31
Comment
Leslancer
règlesunSQL
Explain Plan d’une requête
d’optimisation
8 -32
Les Description
règles SQL dud’optimisation
Explain Plan
8 -33
Les Description
règles SQL dud’optimisation
Explain Plan
Id
Identifiant unique interne de sa requête d’analyse (n° séquentiel
généré par Oracle).
OPERATION
Nom de l’opération interne exécutée lors de l’étape relative à l’occurrence affichée.
Pour la 1ère occurrence (ID=0), cela correspond au type de requête analysée :
DELETE STATEMENT
INSERT STATEMENT
SELECT STATEMENT
UPDATE STATEMENT 8 -34
Les Description
règles SQL dud’optimisation
Explain Plan
NAME
L’objet exploité : Nom de la table ou de l’index utilisé dans l’opération
élémentaire.
ROWS
estimation du nombre de ligne que Oracle va devoir examiner pour exécuter la requête
BYTES
Taille estimée d’octets accédés par l’opération élémentaire
8 -35
Les Description
règles SQL dud’optimisation
Explain Plan
COST
Coût d’exécution de la requête estimé par l’optimiseur Oracle. C’est une
notion abstraite à utiliser pour comparer 2 plans d’exécutions différents. Ce
coût est calculé en fonction des informations CPU_COST et IO_COST.
TIME
Temps elapsed en seconds estimé pour exécuter l’opération élémentaire.
La valeur doit être la plus petite possible.
COST
Coût d’exécution de la requête estimé par l’optimiseur Oracle. C’est une
notion abstraite à utiliser pour comparer 2 plans d’exécutions différents. Ce
coût est calculé en fonction des informations CPU_COST et IO_COST.
CARDINALITE
Nombre estimé de lignes accédées par l’opération élémentaire
BYTES
Taille estimée d’octets accédés par l’opération élémentaire.
8 -37
Plan
Les d’execution
règles d’une requête
SQL d’optimisation
8 -40
Le rôle d’unutilisé
méthode indexe dans lepour
par l’optimiseur parcours d’une
récupérer les donnéestable
8 -41
Le rôle d’unutilisé
méthode indexe dans lepour
par l’optimiseur parcours d’une
récupérer les table
données
8 -42
Le rôle d’unutilisé
méthode indexe dans lepour
par l’optimiseur parcours d’une
récupérer les table
données
8 -43
Les règles SQL d’optimisation
Parcours d’une table via une clé primaire
(indexe crée par Oracle par défaut)
8 -44
INDEX UNIQUE SCAN réalise un parcours seul du B-tree.
La base de données utilise cette opération si une
contrainte unique assure que le critère de recherche
ne correspondront pas à plus d'une entrée
8 -45
Les règles SQL d’optimisation
Parcours d’une table via une clé étrangère
(indexe non déclaré au niveau clé étrangère)
8 -47
Les règles SQL d’optimisation
Creation des indexes pour toutes les clés etrangeres
(D:\cours_nejib\cours_tuning\debutant\creation_indexe_explicite_volume.sql)
drop index emp_dept;
drop index emp_job;
drop index emp_manager;
drop index date_embauche_ind ;
drop index job_hist_dept ;
drop index job_hist_job ;
create index emp_dept on employees (code_dept)
Tablespace VOLUME_INDEXE;
create index emp_job on employees (code_job)
Tablespace VOLUME_INDEXE;
create index emp_manager on employees (code_manager)
Tablespace VOLUME_INDEXE;
create index date_embauche_ind on employees (date_embauche)
Tablespace VOLUME_INDEXE;
create index job_hist_dept on job_hist (code_dept)
Tablespace VOLUME_INDEXE;
create index job_hist_job on job_hist (code_job)
Tablespace VOLUME_INDEXE; 8 -48
Les règles SQL d’optimisation
8 -49
Liste des indexes d’un compte
Purge recyclebin;
select ind.TABLE_NAME,ind.INDEX_NAME,ind.COLUMN_NAME,
ind.COLUMN_POSITION
from user_ind_columns ind
order by ind.TABLE_NAME,ind.INDEX_NAME,ind.COLUMN_POSITION
8 -50
Le rôle d’un indexe dans
Parcours leindexe
avec parcours d’une table
8 -51
Le rôle d’un indexe dans
INDEX le parcours
RANGE SCAN d’une table
L'opération INDEX RANGE SCAN réalise un parcours du B-tree et suit la
chaîne de nœuds feuilles pour trouver toutes les entrées correspondantes.
Le balayage d'intervalle d'index (index range scan):
L'index est parcouru pour trouver les valeurs. Les clauses d'égalité,
supériorité ou infériorité déclenchent généralement ces opérations
8 -52
Le rôle d’un indexe
Parcours dans
avec le parcours d’une table
indexe
8 -53
Les règles SQL d’optimisation
Un index n’est pas utilisé si une colonne indexée figure dans une fonction
8 -54
Les règles SQL d’optimisation
Un index n’est pas utilisé si une colonne indexée figure dans une fonction
8 -55
Les règles SQL d’optmisation
Un index n’est pas utilisé lorsqu’une colonne indexée est comparée à NULL
8 -56
Les règles SQL d’optmisation
Un index n’est pas utilisé lorsqu’une colonne indexée est comparée à NULL
8 -59
Drop index nom_employe_ind ;
8 -60
8 -61
INDEX SKIP SCAN
Est utilisé pour un index avec plusieurs champs si dans votre
requête vous ne prenez pas en compte tous les champs de l’index,
généralement le premier.
8 -62
Dans une expression filtrée, placez toujours une colonne seule d'un
côté de l'opérateur de comparaison.
8 -63
8 -64
LES INDEXES BITMAP
8 -65
LES INDEXES BITMAP
Bitmap Index Full Scan :Un parcours de bitmap récupère tous les
pointeurs de ligne dans l'index en un coup
BITMAP CONVERSION COUNT : Compte le nombre de bit à 1
8 -70
Pour éviter ce comportement je l’oblige à exploiter mon indexe
8 -71
Bitmap index single value
L'analyse d'index bitmap à valeur unique est effectuée par Oracle lorsque la
requête spécifie une condition d'égalité pour une colonne indexée bitmap
8 -72
8 -73
RECOMMANDATIONS
8 -74
RECOMMANDATIONS
8 -75
Evitez d’utiliser DISTINCT lorsque cela n’est pas nécessaire
SORT UNIQUE
Trie les lignes et supprime les doublon
8 -78
N’employez pas de colonne dans la clause SELECT de la sous requête EXISTS
HASH JOIN
La jointure de hachage charge les enregistrements candidats d'un côté de la
jointure dans une table de hachage qui est ensuite sondée pour chaque ligne
8 -79
de l'autre côté de la jointure.
N’employez pas de colonne dans la clause SELECT de la sous requête EXISTS
8 -80
Utilisation de IN
8 -81
8 -82
8 -83
8 -84
Analyse d’une requête par l’optimiseur
En cas de sous-interrogation avec IN
8 -85
1) TABLE ACCESS FULL sur « departement »
3) INDEX FULL SCAN : Lit l'index entier (toutes les lignes) dans l'ordre de
l'index. Suivant différentes statistiques système, la base de données peut
choisir de réaliser cette opération car elle a besoin de toutes les lignes dans
l'ordre de l'index
8 -86
Analyse d’une requête par l’optimiseur
Ou bien
8 -87
Prédicat EXISTS :pour chaque ligne ramenée par le select principal on
va exécuter le sous select
La requête externe s’exécutera uniquement si la requete interne
retourne au moins un résultat
8 -88
Analyse d’une requête par l’optimiseur
En cas de sous-interrogation avec EXISTS
8 -89
1) TABLE ACCESS BY INDEX ROWID : Récupère une ligne à partir de la table en
utilisant le ROWID récupéré lors d'une recherche précédente dans l'index
Voir le lien suivant : https://use-the-index-luke.com/fr/sql/anatomie-dun-index
4) SORT UNIQUE
Trie les lignes et supprime les doublon
8 -90
Analyse d’une requête par l’optimiseur
Avec EXISTS
8 -91
Analyse d’une requête par l’optimiseur
Avec EXISTS
8 -92
Choix entre IN ou EXISTS
8 -94
8 -95
8 -96
Evitez d’utiliser le LIKE si une fourchette de recherche le permet
8 -97
Evitez d’utiliser le LIKE si une fourchette de recherche le permet
8 -98
Evitez les jointures dans le WHERE
Préférez l’operateur normalisé JOIN
8 -99
Evitez les jointures dans le WHERE
Préférez l’operateur normalisé JOIN
8 -100
Evitez les jointures dans le WHERE
Préférez l’operateur normalisé JOIN
8 -101
Evitez les jointures dans le WHERE
Préférez l’operateur normalisé JOIN
8 -102
Evitez les fourchettes <and> pour des valeurs discrètes
Préférez le between
8 -103
Transformez les sous requetes <> all en NOT IN
8 -104
Transformez les sous requetes <> all en NOT IN
8 -105
Transformez les sous requetes = ANY en IN
8 -106
RECOMMANDATIONS
8 -107
RECOMMANDATIONS
8 -108
8 -109
8 -110
Conseils pour définir vos indexes
8 -111
Conseils pour définir vos indexes
8 -112
Les principes de base pour la déclaration des indexes explicites
(un bon indexe sert à optimiser la recherche)
8 -113
Les principes de base pour la déclaration des indexes explicites
(un bon indexe sert à optimiser la recherche)
8 -114
Dans quel cas ne pas utiliser les indexes
8 -115
8 -116
8 -117
8 -118
8 -119
8 -120
8 -121
Une vue est en fait le fruit d'une requête. Chez Oracle, quand on crée
une vue et qu'on l'interroge Oracle ne fait ni plus ni moins qu'une
réécriture de requête
8 -122
8 -123
grant alter any materialized view to OTR
/
grant create any materialized view to OTR
/
grant unlimited tablespace to OTR
/
8 -124
drop materialized view formation
/
create materialized view formation
as select
e.code_employe,e.nom_employe,e.pre_employe,d.nom_dept,j.nom_job
from employees e,departement d,job j
where e.code_dept = d.code_dept
and e.code_job = j.code_job
/
8 -125
8 -126
drop materialized view formation
/
create materialized view formation
refresh next sysdate + 1/24/60
as select
e.code_employe,e.nom_employe,e.pre_employe,d.nom_dept,j.nom_job
from employees e,departement d,job j
where e.code_dept = d.code_dept
and e.code_job = j.code_job
/
8 -127
8 -128
les indexes non exploités
8 -129
Après une période d’exploitation (15 jours) exécuter le script suivant Pour
arrêter l’analyse