SlideShare a Scribd company logo
1 of 137
Download to read offline
Gestion des index SQL : Soyez
          AWARE !

Antonio Gomes Rodrigues
Antonio Gomes Rodrigues
@ra0077


Consultant chez Aliecom


Rédacteur pour developpez.com


Conférencier                0
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Pourquoi optimiser les index

               Les problèmes de
               bases de données
               sont régulièrement
               dans le top 5 des
               problèmes de
               performance d'une
               application Java
Pourquoi optimiser les index

JPA/Hibernate, Spring JDBC et JDBC ont pour
point commun de générer des requêtes SQL
Pourquoi optimiser les index
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Attention : DBA, c'est un métier
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Théorie : Etude de cas
Théorie : Un index, c'est quoi ?
Théorie : Un index, c'est quoi ?




Représentation triée des éléments indexés à
        l'aide d'un arbre équilibré
Théorie : Un index, c'est quoi ?
Théorie : Un index, comment ça marche ?
Théorie : Plan d'execution
explain plan for select nom,prenom from clients where sex = 'MALE'
select * from table(dbms_xplan.display)


Plan hash value: 4036073249

-----------------------------------------------------------------------------

| Id    | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|     0 | SELECT STATEMENT   |         |   500 | 11000 |      9   (0)| 00:00:01 |

|*    1 |   TABLE ACCESS FULL| CLIENTS |   500 | 11000 |      9   (0)| 00:00:01 |

-----------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

     1 - filter("SEX"='MALE')
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : Plan d'execution
Théorie : CBO

Et comment le plan d'exécution est décidé ?
Théorie : CBO



CBO = Cost Based Optimizer
Théorie : Info sur les index d'une table


select index_name, index_type, uniqueness
from user_indexes
where table_name = 'CLIENTS';
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Quiz 1 : ?
Quiz 1 : Explication



  Re équilibrer l'arbre
  Ecrire à au moins deux endroits
  (table et index)
Quiz 1 : ?
Quiz 1 : Explication



  Plus d'index != meilleur perf
  Il suffit d'un seul
Quiz 1: Nombre d'index


                          Plus d'index != plus de performance
                          Et donc il faut trouver le bon index




Making of
http://blog.aliecom.com/pourquoi-il-faut-faire-attention-au-nombre-dindex-sql/
Quiz 2 : ?


                  L'index est il utilisé ?



create table CLIENTS ....


create index pk_clients on clients(id_client)


select id_client from clients where id_client = '5'
Quiz 2 : Réponse


Non
Quiz 2 : Explication



  Index sur clé primaire crée
  automatiquement dans Oracle.

  SQL> create index pk_clients on
  clients(id_client);
  ERROR at line 1:
  ORA-01408: such column list already indexed
Quiz 2 : Index par défaut


  Be aware sur la politique de création
  d'index par défaut
Quiz 3 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index ix_clientx_pays on clients(pays)
select nom,prenom from clients where upper(pays) =
'UNITED STATES'

-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |   1000 |   99K|     9    (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   1000 |    99K|     9   (0)| 00:00:01 |

-----------------------------------------------------------------------------
Quiz 3 : Indice

-----------------------------------------------------------------------------

| Id    | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|     0 | SELECT STATEMENT   |         |   1000 |    99K|     9   (0)| 00:00:01 |

|*    1 |   TABLE ACCESS FULL| CLIENTS |   1000 |    99K|     9   (0)| 00:00:01 |

-----------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------



PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------



     1 - filter(UPPER("PAYS")='UNITED STATES')
Quiz 3 : Explication
Quiz 3 : Solution



create index ix_clientx_pays2
on clients(upper(pays))
Quiz 3 : Solution

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

|    0 | SELECT STATEMENT             |                 |    10 |   1020 |   5

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS         |    10 |   1020 |   5

|*   2 |   INDEX RANGE SCAN           | IX_CLIENTX_PAYS2 |    4 |        |   4

--------------------------------------------------------------------------------
Quiz 3 : ?

             L'index est il utilisé ?

create index ix_clientx_sex on clients(sex)


select nom,prenom from clients where UPPER(sex) =
'MALE'
Quiz 3 : Indice
Quiz 3 : Réponse


                            Non


-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |    10 |    220 |     9   (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   10 |    220 |     9    (0)| 00:00:01 |

-----------------------------------------------------------------------------
Quiz 3 : Index de fonction


   Be aware lors de l'utilisation de
   fonction dans les requêtes SQL
Quiz 4 : ?

                         Pourquoi l'index n'est pas utilisé ?

create index ix_clientx_sex on clients(sex)
select nom,prenom from clients where sex is null
-----------------------------------------------------------------------------

| Id    | Operation         | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |   1000 | 22000 |   48    (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   1000 | 22000 |    48   (0)| 00:00:01 |

-----------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------

       1 - filter("SEX" IS NULL)
Quiz 4 : Explication
Quiz 4 : Solution



CREATE INDEX index_null ON
clients (sex, '1')
Quiz 4 : Solution

---------------------------------------------------------------------------------------

| Id   | Operation                    | Name      | Rows   | Bytes | Cost (%CPU)| Time

----------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT             |           |    1000 | 22000 |   32   (0)| 00:00:01

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS   |    1000 | 22000 |   32   (0)| 00:00:01

|*   2 |   INDEX RANGE SCAN           | INDEX_NULL |   1000 |       |    4   (0)| 00:00:01

----------------------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------

     2 - access("SEX" IS NULL)
Quiz 4 : Indexer les null


  Be aware à ne pas oublier les
  contraintes dans le schéma de bdd
  Be aware aux valeurs null
  Bien connaitre sin serveur de bdd
Quiz 5 : ?

                        Existe t il un meilleur index ?

create index clients_identifiant_unique_ix on
clients(identifiant_unique);
select id_client from clients where identifiant_unique
like '109876545210387';

--------------------------------------------------------------------------------

|    0 | SELECT STATEMENT            |                               |    1 |

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS                      |    1 |

|*   2 |    INDEX RANGE SCAN          | CLIENTS_IDENTIFIANT_UNIQUE_IX |   4 |

--------------------------------------------------------------------------------
Quiz 5 : Indice



create index clients_identifiant_unique_ix on
clients(identifiant_unique)
select id_client from clients where identifiant_unique
like '109876545210387'
Quiz 5 : Explication
Quiz 5 : Solution



create unique index
clients_identifiant_unique_ix
on
clients(identifiant_unique)
Quiz 5 : Solution

--------------------------------------------------------------------------------

|     0 | SELECT STATEMENT             |                    |     1 |      22 |

|     1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS            |     1 |      22 |

|*    2 |   INDEX UNIQUE SCAN          | CLIENTS_IDENTIFIANT_UNIQUE_IX |     1 |   |

--------------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------

     2 - access("IDENTIFIANT_UNIQUE"='109876545210387')
Quiz 5 : Index unique


 Be aware lors de la création du
 schéma de la base de données


 Si un champ est unique, le dire à
 Oracle
Quiz 6 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index ix_clientx_sex on clients(sex)
select nom,prenom from clients where sex = 'MALE'
-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |   510 | 11220 |     9    (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   510 | 11220 |      9   (0)| 00:00:01 |

-----------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------

     1 - filter("SEX"='MALE')
Quiz 6 : Indice



CBO = Cost Based Optimizer
Quiz 6 : Explication




select count(*) from clients where sex = 'MALE'
-> 51% des lignes
Quiz 6 : Preuve


Si on change la répartition (de 51% à 8,5%)


-------------------------------------------------------------------------------------

| Id   | Operation                    | Name          | Rows   | Bytes | Cost (%CPU)|

-------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT             |               |   511 | 11753 |    18    (0)|

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS       |   511 | 11753 |    18    (0)|

|*   2 |   INDEX RANGE SCAN          | IX_CLIENTX_SEX |   511 |        |     3   (0)|

--------------------------------------------------------------------------------
Quiz 6 : Répartition des données


      Be aware sur la validité d'un index au
      cours de sa vie


      Superviser votre serveur de base de
      données
Quiz 7 : ?

             L'index est il utilisé ?


create index ix_clientx_sex on clients(sex)
select nom,prenom from clients where sex is null
Quiz 7 : Indice
Quiz 7 : Explication
Quiz 7 : Moteur de base de données


        Be aware sur les possibilitées du
        serveur de bases de données utilisés


        Be aware sur le contexte des astuces
        trouvées sur Internet
Quiz 8 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index ix_clientx_sex on clients(sex)
# Ajout de données dans la table clients
select nom,prenom from clients where sex = 'MALE'

-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |   510 | 11220 |     9    (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   510 | 11220 |      9   (0)| 00:00:01 |

-----------------------------------------------------------------------------
Quiz 8 : Indice



CBO = Cost Based Optimizer
Quiz 8 : Explication




 CBO se base sur des données
 obsolètes pour faire le choix du
 plan d'exécution de la requête
Quiz 8 : Solution



EXEC
dbms_stats.gather_table_stats('SYSTEM','Clients',casca
de=>TRUE);

-------------------------------------------------------------------------------------

| Id   | Operation                    | Name          | Rows   | Bytes | Cost (%CPU)|

-------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT             |               |   511 | 11753 |    18    (0)|

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS       |   511 | 11753 |    18    (0)|

|*   2 |   INDEX RANGE SCAN          | IX_CLIENTX_SEX |   511 |        |     3   (0)|

--------------------------------------------------------------------------------
Quiz 8 : Statistiques


Ne pas oublier de faire régulièrement
des update stat


Ne pas oublier de faire des update
stats après un gros changement de
données (update, insert, delete)
Quiz 9 : ?

                        Existe t il un meilleur index ?


create index clients_nom_ix on clients(nom)
select nom, prenom from clients where nom like 'A%'


--------------------------------------------------------------------------------

|    0 | SELECT STATEMENT            |                |   37 |   2516 |   8

|    1 |   TABLE ACCESS BY INDEX ROWID| CLIENTS       |   37 |   2516 |   8

|*   2 |    INDEX RANGE SCAN         | CLIENTS_NOM_IX |    9 |       |    2

--------------------------------------------------------------------------------
Quiz 9 : Indice
Quiz 9 : Solution

create index clients_nom_prenom_ix on clients(nom,prenom)
Quiz 9 : Solution



create index clients_nom_prenom_ix on
clients(nom,prenom)


--------------------------------------------------------------------------------

|    0 | SELECT STATEMENT |                       |    38 |   570 |    2   (0)|

|*   1 |   INDEX RANGE SCAN| CLIENTS_NOM_PRENOM_IX |   38 |   570 |    2   (0)|

--------------------------------------------------------------------------------
Quiz 9 : Index couvrant


 Be aware de l'existence des index
 couvrants


 Be aware au coût de gestion d'un
 index couvrant
Quiz 10 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index clients_id_unique_nom_ix on
clients(identifiant_unique,nom)
select nom from clients where identifiant_unique like
'%1'

-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |   5000 |   117K|   701   (1)| 00:00:09 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |   5000 |   117K|   701   (1)| 00:00:09 |

-----------------------------------------------------------------------------
Quiz 10 : Explication
Quiz 10 : Solution




create index rev_clients_id_unique_nom_ix on
clients(reverse(identifiant_unique),nom)


select nom from clients where
reverse(identifiant_unique) like '1%'
Quiz 10 : Accès aux données


    Be aware lors de l'écriture des
    requêtes
Quiz 11 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index ix_clients_num_rue on
clients(numero_de_rue)
select nom, prenom from clients where numero_de_rue = 1


-----------------------------------------------------------------------------

| Id   | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |         |    20 |   360 |     9    (0)| 00:00:01 |

|*   1 |   TABLE ACCESS FULL| CLIENTS |    20 |   360 |     9    (0)| 00:00:01 |

-----------------------------------------------------------------------------
Quiz 11 : Indice
Quiz 11 : Indice

-----------------------------------------------------------------------------

| Id    | Operation          | Name    | Rows   | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|     0 | SELECT STATEMENT   |         |    20 |    360 |     9   (0)| 00:00:01 |

|*    1 |   TABLE ACCESS FULL| CLIENTS |    20 |    360 |     9   (0)| 00:00:01 |

-----------------------------------------------------------------------------



Predicate Information (identified by operation id):

---------------------------------------------------



PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------



     1 - filter(TO_NUMBER("NUMERO_DE_RUE")=1)
Quiz 11 : Explication



  Oracle fait une conversion
  automatique
Quiz 11 : Solution

select nom, prenom from clients where numero_de_rue = '1'
Quiz 11 : Conversion automatique


      Be aware aux conversions
      automatiques


      Be aware lors de la création du
      schéma de bdd
Quiz 12 : ?

                        Pourquoi l'index n'est pas utilisé ?

create index achats_prix_ix on achats(prix);
select count(*) from achats where prix + 10 = 500



-----------------------------------------------------------------------------

| Id   | Operation          | Name   | Rows   | Bytes | Cost (%CPU)| Time    |

-----------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |        |     1 |      4 |   43    (0)| 00:00:01 |

|    1 |   SORT AGGREGATE   |        |     1 |      4 |            |         |

|*   2 |    TABLE ACCESS FULL| ACHATS |   100 |   400 |    43   (0)| 00:00:01 |

-----------------------------------------------------------------------------
Quiz 12 : Explication
Quiz 12 : Solution

select count(*) from achats where prix = 500 - 10



--------------------------------------------------------------------------------

|    0 | SELECT STATEMENT   |               |    1 |     4 |     1   (0)|

|    1 |   SORT AGGREGATE   |               |    1 |     4 |            |

|*   2 |   INDEX RANGE SCAN| ACHATS_PRIX_IX |   13 |   52 |     1    (0)|

--------------------------------------------------------------------------------
Quiz 12 : Accès aux données


    Be aware lors de l'écriture des
    requêtes
Quiz 13 : ?

               Quel est la requête la plus rapide ?


A : select count(*) from achats
B : select count(1) from achats
Quiz 13 : Solution

select count(*) from achats

-----------------------------------------------------------------------------

|   0 | SELECT STATEMENT       |             |     1 |    516   (1)| 00:00:07 |

|   1 |   SORT AGGREGATE       |             |     1 |             |          |

|   2 |    INDEX FAST FULL SCAN| SYS_C007034 |   985K|    516   (1)| 00:00:07 |

-----------------------------------------------------------------------------



select count(1) from achats

-----------------------------------------------------------------------------

| Id   | Operation             | Name        | Rows   | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|   0 | SELECT STATEMENT       |             |     1 |    516   (1)| 00:00:07 |

|   1 |   SORT AGGREGATE       |             |     1 |             |          |

|   2 |    INDEX FAST FULL SCAN| SYS_C007034 |   985K|    516   (1)| 00:00:07 |

-----------------------------------------------------------------------------
Quiz 13 : Astuces sur Internet


     Méfiez vous des "astuces" trouvées
     sur Internet


     Mesurez, ne devinez pas
Quiz 14 : ?

                           Existe t il un meilleur index ?

create index achats_p_id on achats(prix,id_achat)
select prix,id_achat from achats where prix > 30 order
by prix asc,id_achat desc


-------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT      |             |    963K|   9411K|     |    4629   (2)|

|    1 |   SORT ORDER BY       |             |    963K|   9411K|   18M|   4629   (2)|

|*   2 |    INDEX FAST FULL SCAN| ACHATS_P_ID |   963K|   9411K|     |    764    (2)|

-------------------------------------------------------------------------------------
Quiz 14 : Indice




Index = Représentation triée des éléments
indexés à l'aide d'un arbre équilibré
Quiz 14 : Indice




create index achats_p_id on achats(prix,id_achat)
select prix,id_achat from achats where prix > 30 order
by prix asc,id_achat desc


-------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT       |             |   963K|   9411K|      |   4629   (2)|

|    1 |   SORT ORDER BY        |            |    963K|   9411K|   18M|   4629   (2)|

|*   2 |    INDEX FAST FULL SCAN| ACHATS_P_ID |   963K|   9411K|      |    764   (2)|

-------------------------------------------------------------------------------------
Quiz 14 : Solution




create index achats_p_id2 on achats(prix asc,id_achat
desc)



---------------------------------------------------------------------------------

| Id   | Operation         | Name        | Rows   | Bytes | Cost (%CPU)| Time       |

---------------------------------------------------------------------------------

|    0 | SELECT STATEMENT |              |    963K|   9411K|   2827   (1)| 00:00:34 |

|*   1 |   INDEX RANGE SCAN| ACHATS_P_ID2 |   963K|   9411K|   2827   (1)| 00:00:34 |

---------------------------------------------------------------------------------
Quiz 14 : Ordre des index


   Be aware sur l'ordre des index et
   l'ordre d'accès aux données
Quiz 15 : ?

             Pourquoi l'index n'est pas utilisé ?

create index clients_n_ix on clients(nom)
Quiz 15 : Indice
Quiz 15 : Indice
Quiz 15 : Explication
Hibernate:
    /* criteria query */ select
        this_.ID_CLIENT as ID1_0_0_,
        this_.NOM as NOM0_0_,
        ...
        this_.IDENTIFIANT_UNIQUE as IDENTIF17_0_0_
    from
        SYSTEM.CLIENTS this_
    where
        lower(this_.NOM)=?
Quiz 15 : Solution


Index de fonction
Ne pas utiliser ilike/ignoreCase()
Contrainte sur les valeurs de la table
Quiz 15 : ORM/Framework


   Be aware sur le comportement des
   librairies utilisées
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Méthodologie



   Mesurez, ne devinez pas
Méthodologie
Méthodologie
Avoir plateforme de test réaliste
select * from t_conducteur
left join t_voiture on id_conducteur=conducteur_fk
where couleur = 'rouge'




                   x 200
Avoir plateforme de test réaliste



     Avoir un volume de données le plus
     proche possible de celui en
     production
Avoir plateforme de test réaliste
Avoir plateforme de test réaliste



     Avoir un serveur de base de
     données avec la configuration la
     plus proche possible de celle en
     production
Méthodologie
Récupérer les requêtes lentes et
          fréquentes
Récupérer les requêtes lentes et
          fréquentes
Récupérer les requêtes lentes et
            fréquentes
A utiliser plutôt pour
tuner le serveur de
bases de données
Récupérer les requêtes lentes et
          fréquentes


      Requête par requête ?
Récupérer les requêtes lentes et
          fréquentes


      Requête par requête ?
Récupérer les requêtes lentes et
          fréquentes
Récupérer les requêtes lentes et
          fréquentes
Récupérer les requêtes lentes et
          fréquentes
Méthodologie
Eliminer l'inutile

Une requête rapide = une requête qui n'existe pas
Eliminer l'inutile


Attention aux n+1 select avec les ORM




http://arodrigues.developpez.com/tutoriels/java/performance/hibernate-
performance-part1-strategies-chargement/
Eliminer l'inutile

Utiliser des caches
Eliminer l'inutile

Ne récupérer que le nécessaire

select * from clients

Statistics

----------------------------------------------------------

 19 329 961   bytes sent via SQL*Net to client

     100000   rows processed



select nom,prenom from clients

Statistics

----------------------------------------------------------

  2 351 810   bytes sent via SQL*Net to client

     100000   rows processed
Eliminer l'inutile
Utiliser avec précaution des PreparedStatement à la place de Statement
Eliminer l'inutile


Purge des données inutiles
Eliminer l'inutile

Séparer les données courantes
des données historiques
Méthodologie
Ajout d'index
Sur quoi mettre un index ?


                                clé étrangère
                                clause where
                               index couvrant
                                        order
                                    group by
                                       union
                                      distinct
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas ?
Conclusion
Et si cela ne suffit pas ?
Table space
index bitmap
schéma bdd
IOT (Index Organised Table)
Tuning du serveur de base de données
...
Appeler un DBA
Gestion des index SQL : Soyez AWARE !


Pourquoi optimiser les index
Attention
Un peu de théorie
Quiz
Méthodologie
Et si cela ne suffit pas
Conclusion
Conclusion



 BE AWARE

More Related Content

Viewers also liked

Viewers also liked (20)

Présentation Edibatec
Présentation EdibatecPrésentation Edibatec
Présentation Edibatec
 
Duna Blanco
Duna BlancoDuna Blanco
Duna Blanco
 
PRESENTACION
PRESENTACIONPRESENTACION
PRESENTACION
 
Document du Board of Investment mauricien
Document du Board of Investment mauricienDocument du Board of Investment mauricien
Document du Board of Investment mauricien
 
¿Qué te parecería?
¿Qué te parecería?¿Qué te parecería?
¿Qué te parecería?
 
Original et spcial
Original et spcialOriginal et spcial
Original et spcial
 
Fundación Rafael Preciado
Fundación Rafael PreciadoFundación Rafael Preciado
Fundación Rafael Preciado
 
Cuisine traditionelle au vietnam
Cuisine traditionelle au vietnamCuisine traditionelle au vietnam
Cuisine traditionelle au vietnam
 
Mam
MamMam
Mam
 
34 Robertson La Robotique Pour La RééDucation
34 Robertson La Robotique Pour La RééDucation34 Robertson La Robotique Pour La RééDucation
34 Robertson La Robotique Pour La RééDucation
 
Robots
RobotsRobots
Robots
 
Festejos de primavera
Festejos de primaveraFestejos de primavera
Festejos de primavera
 
pour ceux qui pensent que leur travail et dur
pour ceux qui pensent que leur travail et durpour ceux qui pensent que leur travail et dur
pour ceux qui pensent que leur travail et dur
 
Llista Esquerra Manresa
Llista Esquerra ManresaLlista Esquerra Manresa
Llista Esquerra Manresa
 
L'image de marque de la presse
L'image de marque de la presseL'image de marque de la presse
L'image de marque de la presse
 
Franklin+power point
Franklin+power pointFranklin+power point
Franklin+power point
 
Evangelización 2.0
Evangelización 2.0Evangelización 2.0
Evangelización 2.0
 
Kaouther Ragoubi Book_2016
Kaouther Ragoubi Book_2016Kaouther Ragoubi Book_2016
Kaouther Ragoubi Book_2016
 
Presentation husseini-original
Presentation   husseini-originalPresentation   husseini-original
Presentation husseini-original
 
Rapport stage
Rapport stageRapport stage
Rapport stage
 

Similar to Gestion des index SQL : Soyez AWARE !

Cours d'Algorithmique et langage C .pdf
Cours d'Algorithmique et langage C  .pdfCours d'Algorithmique et langage C  .pdf
Cours d'Algorithmique et langage C .pdfkamalomari2
 
Algorithmique et langage de programmation c
Algorithmique et langage de programmation cAlgorithmique et langage de programmation c
Algorithmique et langage de programmation cEmilianoSala2
 
Business Intelligence
Business IntelligenceBusiness Intelligence
Business IntelligenceWalid Chamour
 
Formation M2i - Microsoft SQL Server 2022 - Les nouveautés
Formation M2i - Microsoft SQL Server 2022 - Les nouveautésFormation M2i - Microsoft SQL Server 2022 - Les nouveautés
Formation M2i - Microsoft SQL Server 2022 - Les nouveautésM2i Formation
 
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdf
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdfTS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdf
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdfFootballLovers9
 
Fonctions Mono-Ligne
Fonctions Mono-LigneFonctions Mono-Ligne
Fonctions Mono-Lignewebreaker
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015Rodolphe Quiédeville
 
Demonstration injection de code
Demonstration injection de codeDemonstration injection de code
Demonstration injection de codePRONETIS
 
[DAF 2015] Atelier API AT internet
[DAF 2015] Atelier API AT internet[DAF 2015] Atelier API AT internet
[DAF 2015] Atelier API AT internetAT Internet
 
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...Microsoft Technet France
 
Deep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerDeep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerMicrosoft
 
Rapport de stage CSC ghazala
Rapport de stage CSC ghazala Rapport de stage CSC ghazala
Rapport de stage CSC ghazala Ibtissem oueslati
 
Bachelor's degree final project
Bachelor's degree final projectBachelor's degree final project
Bachelor's degree final projectoumaimaelmiayar
 

Similar to Gestion des index SQL : Soyez AWARE ! (20)

Cours d'Algorithmique et langage C .pdf
Cours d'Algorithmique et langage C  .pdfCours d'Algorithmique et langage C  .pdf
Cours d'Algorithmique et langage C .pdf
 
Algorithmique et langage de programmation c
Algorithmique et langage de programmation cAlgorithmique et langage de programmation c
Algorithmique et langage de programmation c
 
1 2-3-grails
1 2-3-grails1 2-3-grails
1 2-3-grails
 
Business Intelligence
Business IntelligenceBusiness Intelligence
Business Intelligence
 
Formation M2i - Microsoft SQL Server 2022 - Les nouveautés
Formation M2i - Microsoft SQL Server 2022 - Les nouveautésFormation M2i - Microsoft SQL Server 2022 - Les nouveautés
Formation M2i - Microsoft SQL Server 2022 - Les nouveautés
 
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdf
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdfTS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdf
TS-TC-comptabilite-generale-2-manuel-stagiaire.docx.pdf
 
Namaa.APA.Report
Namaa.APA.ReportNamaa.APA.Report
Namaa.APA.Report
 
Retour d'expérience sur PowerShell
Retour d'expérience sur PowerShellRetour d'expérience sur PowerShell
Retour d'expérience sur PowerShell
 
Fonctions Mono-Ligne
Fonctions Mono-LigneFonctions Mono-Ligne
Fonctions Mono-Ligne
 
Orchestration
OrchestrationOrchestration
Orchestration
 
Orchestration
OrchestrationOrchestration
Orchestration
 
Pytong2015
Pytong2015Pytong2015
Pytong2015
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015
 
Demonstration injection de code
Demonstration injection de codeDemonstration injection de code
Demonstration injection de code
 
[DAF 2015] Atelier API AT internet
[DAF 2015] Atelier API AT internet[DAF 2015] Atelier API AT internet
[DAF 2015] Atelier API AT internet
 
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...
Retour d'expérience Bouygues Telecom : Analyse BI à l'aide d'une appliance SQ...
 
Pmi fr
Pmi frPmi fr
Pmi fr
 
Deep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerDeep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL Server
 
Rapport de stage CSC ghazala
Rapport de stage CSC ghazala Rapport de stage CSC ghazala
Rapport de stage CSC ghazala
 
Bachelor's degree final project
Bachelor's degree final projectBachelor's degree final project
Bachelor's degree final project
 

More from Antonio Gomes Rodrigues

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...Antonio Gomes Rodrigues
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseAntonio Gomes Rodrigues
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUGAntonio Gomes Rodrigues
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaAntonio Gomes Rodrigues
 
Tests de performances d'une application Java EE
Tests de performances d'une application Java EETests de performances d'une application Java EE
Tests de performances d'une application Java EEAntonio Gomes Rodrigues
 

More from Antonio Gomes Rodrigues (8)

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
 
Condensé de mom illustré
Condensé de mom illustréCondensé de mom illustré
Condensé de mom illustré
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesse
 
PerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APMPerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APM
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
 
Test de charge avec Apache JMeter
Test de charge avec Apache JMeterTest de charge avec Apache JMeter
Test de charge avec Apache JMeter
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
Tests de performances d'une application Java EE
Tests de performances d'une application Java EETests de performances d'une application Java EE
Tests de performances d'une application Java EE
 

Gestion des index SQL : Soyez AWARE !

  • 1. Gestion des index SQL : Soyez AWARE ! Antonio Gomes Rodrigues
  • 2. Antonio Gomes Rodrigues @ra0077 Consultant chez Aliecom Rédacteur pour developpez.com Conférencier 0
  • 3. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 4. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 5. Pourquoi optimiser les index Les problèmes de bases de données sont régulièrement dans le top 5 des problèmes de performance d'une application Java
  • 6. Pourquoi optimiser les index JPA/Hibernate, Spring JDBC et JDBC ont pour point commun de générer des requêtes SQL
  • 8. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 9.
  • 10. Attention : DBA, c'est un métier
  • 11. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 13. Théorie : Un index, c'est quoi ?
  • 14. Théorie : Un index, c'est quoi ? Représentation triée des éléments indexés à l'aide d'un arbre équilibré
  • 15. Théorie : Un index, c'est quoi ?
  • 16. Théorie : Un index, comment ça marche ?
  • 17. Théorie : Plan d'execution explain plan for select nom,prenom from clients where sex = 'MALE' select * from table(dbms_xplan.display) Plan hash value: 4036073249 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 500 | 11000 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 500 | 11000 | 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("SEX"='MALE')
  • 18. Théorie : Plan d'execution
  • 19. Théorie : Plan d'execution
  • 20. Théorie : Plan d'execution
  • 21. Théorie : Plan d'execution
  • 22. Théorie : Plan d'execution
  • 23. Théorie : Plan d'execution
  • 24. Théorie : Plan d'execution
  • 25. Théorie : Plan d'execution
  • 26. Théorie : Plan d'execution
  • 27. Théorie : CBO Et comment le plan d'exécution est décidé ?
  • 28. Théorie : CBO CBO = Cost Based Optimizer
  • 29. Théorie : Info sur les index d'une table select index_name, index_type, uniqueness from user_indexes where table_name = 'CLIENTS';
  • 30. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 31. Quiz 1 : ?
  • 32. Quiz 1 : Explication Re équilibrer l'arbre Ecrire à au moins deux endroits (table et index)
  • 33. Quiz 1 : ?
  • 34. Quiz 1 : Explication Plus d'index != meilleur perf Il suffit d'un seul
  • 35. Quiz 1: Nombre d'index Plus d'index != plus de performance Et donc il faut trouver le bon index Making of http://blog.aliecom.com/pourquoi-il-faut-faire-attention-au-nombre-dindex-sql/
  • 36. Quiz 2 : ? L'index est il utilisé ? create table CLIENTS .... create index pk_clients on clients(id_client) select id_client from clients where id_client = '5'
  • 37. Quiz 2 : Réponse Non
  • 38. Quiz 2 : Explication Index sur clé primaire crée automatiquement dans Oracle. SQL> create index pk_clients on clients(id_client); ERROR at line 1: ORA-01408: such column list already indexed
  • 39. Quiz 2 : Index par défaut Be aware sur la politique de création d'index par défaut
  • 40. Quiz 3 : ? Pourquoi l'index n'est pas utilisé ? create index ix_clientx_pays on clients(pays) select nom,prenom from clients where upper(pays) = 'UNITED STATES' ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 99K| 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 1000 | 99K| 9 (0)| 00:00:01 | -----------------------------------------------------------------------------
  • 41. Quiz 3 : Indice ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 99K| 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 1000 | 99K| 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- 1 - filter(UPPER("PAYS")='UNITED STATES')
  • 42. Quiz 3 : Explication
  • 43. Quiz 3 : Solution create index ix_clientx_pays2 on clients(upper(pays))
  • 44. Quiz 3 : Solution PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 1020 | 5 | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 10 | 1020 | 5 |* 2 | INDEX RANGE SCAN | IX_CLIENTX_PAYS2 | 4 | | 4 --------------------------------------------------------------------------------
  • 45. Quiz 3 : ? L'index est il utilisé ? create index ix_clientx_sex on clients(sex) select nom,prenom from clients where UPPER(sex) = 'MALE'
  • 46. Quiz 3 : Indice
  • 47. Quiz 3 : Réponse Non ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 220 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 10 | 220 | 9 (0)| 00:00:01 | -----------------------------------------------------------------------------
  • 48. Quiz 3 : Index de fonction Be aware lors de l'utilisation de fonction dans les requêtes SQL
  • 49. Quiz 4 : ? Pourquoi l'index n'est pas utilisé ? create index ix_clientx_sex on clients(sex) select nom,prenom from clients where sex is null ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 22000 | 48 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 1000 | 22000 | 48 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("SEX" IS NULL)
  • 50. Quiz 4 : Explication
  • 51. Quiz 4 : Solution CREATE INDEX index_null ON clients (sex, '1')
  • 52. Quiz 4 : Solution --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 22000 | 32 (0)| 00:00:01 | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 1000 | 22000 | 32 (0)| 00:00:01 |* 2 | INDEX RANGE SCAN | INDEX_NULL | 1000 | | 4 (0)| 00:00:01 ---------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("SEX" IS NULL)
  • 53. Quiz 4 : Indexer les null Be aware à ne pas oublier les contraintes dans le schéma de bdd Be aware aux valeurs null Bien connaitre sin serveur de bdd
  • 54. Quiz 5 : ? Existe t il un meilleur index ? create index clients_identifiant_unique_ix on clients(identifiant_unique); select id_client from clients where identifiant_unique like '109876545210387'; -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 1 | |* 2 | INDEX RANGE SCAN | CLIENTS_IDENTIFIANT_UNIQUE_IX | 4 | --------------------------------------------------------------------------------
  • 55. Quiz 5 : Indice create index clients_identifiant_unique_ix on clients(identifiant_unique) select id_client from clients where identifiant_unique like '109876545210387'
  • 56. Quiz 5 : Explication
  • 57. Quiz 5 : Solution create unique index clients_identifiant_unique_ix on clients(identifiant_unique)
  • 58. Quiz 5 : Solution -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 22 | | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 1 | 22 | |* 2 | INDEX UNIQUE SCAN | CLIENTS_IDENTIFIANT_UNIQUE_IX | 1 | | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("IDENTIFIANT_UNIQUE"='109876545210387')
  • 59. Quiz 5 : Index unique Be aware lors de la création du schéma de la base de données Si un champ est unique, le dire à Oracle
  • 60. Quiz 6 : ? Pourquoi l'index n'est pas utilisé ? create index ix_clientx_sex on clients(sex) select nom,prenom from clients where sex = 'MALE' ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 510 | 11220 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 510 | 11220 | 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("SEX"='MALE')
  • 61. Quiz 6 : Indice CBO = Cost Based Optimizer
  • 62. Quiz 6 : Explication select count(*) from clients where sex = 'MALE' -> 51% des lignes
  • 63. Quiz 6 : Preuve Si on change la répartition (de 51% à 8,5%) ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 511 | 11753 | 18 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 511 | 11753 | 18 (0)| |* 2 | INDEX RANGE SCAN | IX_CLIENTX_SEX | 511 | | 3 (0)| --------------------------------------------------------------------------------
  • 64. Quiz 6 : Répartition des données Be aware sur la validité d'un index au cours de sa vie Superviser votre serveur de base de données
  • 65. Quiz 7 : ? L'index est il utilisé ? create index ix_clientx_sex on clients(sex) select nom,prenom from clients where sex is null
  • 66. Quiz 7 : Indice
  • 67. Quiz 7 : Explication
  • 68. Quiz 7 : Moteur de base de données Be aware sur les possibilitées du serveur de bases de données utilisés Be aware sur le contexte des astuces trouvées sur Internet
  • 69. Quiz 8 : ? Pourquoi l'index n'est pas utilisé ? create index ix_clientx_sex on clients(sex) # Ajout de données dans la table clients select nom,prenom from clients where sex = 'MALE' ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 510 | 11220 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 510 | 11220 | 9 (0)| 00:00:01 | -----------------------------------------------------------------------------
  • 70. Quiz 8 : Indice CBO = Cost Based Optimizer
  • 71. Quiz 8 : Explication CBO se base sur des données obsolètes pour faire le choix du plan d'exécution de la requête
  • 72. Quiz 8 : Solution EXEC dbms_stats.gather_table_stats('SYSTEM','Clients',casca de=>TRUE); ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 511 | 11753 | 18 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 511 | 11753 | 18 (0)| |* 2 | INDEX RANGE SCAN | IX_CLIENTX_SEX | 511 | | 3 (0)| --------------------------------------------------------------------------------
  • 73. Quiz 8 : Statistiques Ne pas oublier de faire régulièrement des update stat Ne pas oublier de faire des update stats après un gros changement de données (update, insert, delete)
  • 74. Quiz 9 : ? Existe t il un meilleur index ? create index clients_nom_ix on clients(nom) select nom, prenom from clients where nom like 'A%' -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 37 | 2516 | 8 | 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 37 | 2516 | 8 |* 2 | INDEX RANGE SCAN | CLIENTS_NOM_IX | 9 | | 2 --------------------------------------------------------------------------------
  • 75. Quiz 9 : Indice
  • 76. Quiz 9 : Solution create index clients_nom_prenom_ix on clients(nom,prenom)
  • 77. Quiz 9 : Solution create index clients_nom_prenom_ix on clients(nom,prenom) -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 38 | 570 | 2 (0)| |* 1 | INDEX RANGE SCAN| CLIENTS_NOM_PRENOM_IX | 38 | 570 | 2 (0)| --------------------------------------------------------------------------------
  • 78. Quiz 9 : Index couvrant Be aware de l'existence des index couvrants Be aware au coût de gestion d'un index couvrant
  • 79. Quiz 10 : ? Pourquoi l'index n'est pas utilisé ? create index clients_id_unique_nom_ix on clients(identifiant_unique,nom) select nom from clients where identifiant_unique like '%1' ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5000 | 117K| 701 (1)| 00:00:09 | |* 1 | TABLE ACCESS FULL| CLIENTS | 5000 | 117K| 701 (1)| 00:00:09 | -----------------------------------------------------------------------------
  • 80. Quiz 10 : Explication
  • 81. Quiz 10 : Solution create index rev_clients_id_unique_nom_ix on clients(reverse(identifiant_unique),nom) select nom from clients where reverse(identifiant_unique) like '1%'
  • 82. Quiz 10 : Accès aux données Be aware lors de l'écriture des requêtes
  • 83. Quiz 11 : ? Pourquoi l'index n'est pas utilisé ? create index ix_clients_num_rue on clients(numero_de_rue) select nom, prenom from clients where numero_de_rue = 1 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 20 | 360 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 20 | 360 | 9 (0)| 00:00:01 | -----------------------------------------------------------------------------
  • 84. Quiz 11 : Indice
  • 85. Quiz 11 : Indice ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 20 | 360 | 9 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CLIENTS | 20 | 360 | 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- 1 - filter(TO_NUMBER("NUMERO_DE_RUE")=1)
  • 86. Quiz 11 : Explication Oracle fait une conversion automatique
  • 87. Quiz 11 : Solution select nom, prenom from clients where numero_de_rue = '1'
  • 88. Quiz 11 : Conversion automatique Be aware aux conversions automatiques Be aware lors de la création du schéma de bdd
  • 89. Quiz 12 : ? Pourquoi l'index n'est pas utilisé ? create index achats_prix_ix on achats(prix); select count(*) from achats where prix + 10 = 500 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4 | 43 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 4 | | | |* 2 | TABLE ACCESS FULL| ACHATS | 100 | 400 | 43 (0)| 00:00:01 | -----------------------------------------------------------------------------
  • 90. Quiz 12 : Explication
  • 91. Quiz 12 : Solution select count(*) from achats where prix = 500 - 10 -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4 | 1 (0)| | 1 | SORT AGGREGATE | | 1 | 4 | | |* 2 | INDEX RANGE SCAN| ACHATS_PRIX_IX | 13 | 52 | 1 (0)| --------------------------------------------------------------------------------
  • 92. Quiz 12 : Accès aux données Be aware lors de l'écriture des requêtes
  • 93. Quiz 13 : ? Quel est la requête la plus rapide ? A : select count(*) from achats B : select count(1) from achats
  • 94. Quiz 13 : Solution select count(*) from achats ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 516 (1)| 00:00:07 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FAST FULL SCAN| SYS_C007034 | 985K| 516 (1)| 00:00:07 | ----------------------------------------------------------------------------- select count(1) from achats ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 516 (1)| 00:00:07 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FAST FULL SCAN| SYS_C007034 | 985K| 516 (1)| 00:00:07 | -----------------------------------------------------------------------------
  • 95. Quiz 13 : Astuces sur Internet Méfiez vous des "astuces" trouvées sur Internet Mesurez, ne devinez pas
  • 96. Quiz 14 : ? Existe t il un meilleur index ? create index achats_p_id on achats(prix,id_achat) select prix,id_achat from achats where prix > 30 order by prix asc,id_achat desc ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 963K| 9411K| | 4629 (2)| | 1 | SORT ORDER BY | | 963K| 9411K| 18M| 4629 (2)| |* 2 | INDEX FAST FULL SCAN| ACHATS_P_ID | 963K| 9411K| | 764 (2)| -------------------------------------------------------------------------------------
  • 97. Quiz 14 : Indice Index = Représentation triée des éléments indexés à l'aide d'un arbre équilibré
  • 98. Quiz 14 : Indice create index achats_p_id on achats(prix,id_achat) select prix,id_achat from achats where prix > 30 order by prix asc,id_achat desc ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 963K| 9411K| | 4629 (2)| | 1 | SORT ORDER BY | | 963K| 9411K| 18M| 4629 (2)| |* 2 | INDEX FAST FULL SCAN| ACHATS_P_ID | 963K| 9411K| | 764 (2)| -------------------------------------------------------------------------------------
  • 99. Quiz 14 : Solution create index achats_p_id2 on achats(prix asc,id_achat desc) --------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 963K| 9411K| 2827 (1)| 00:00:34 | |* 1 | INDEX RANGE SCAN| ACHATS_P_ID2 | 963K| 9411K| 2827 (1)| 00:00:34 | ---------------------------------------------------------------------------------
  • 100. Quiz 14 : Ordre des index Be aware sur l'ordre des index et l'ordre d'accès aux données
  • 101. Quiz 15 : ? Pourquoi l'index n'est pas utilisé ? create index clients_n_ix on clients(nom)
  • 102. Quiz 15 : Indice
  • 103. Quiz 15 : Indice
  • 104. Quiz 15 : Explication Hibernate: /* criteria query */ select this_.ID_CLIENT as ID1_0_0_, this_.NOM as NOM0_0_, ... this_.IDENTIFIANT_UNIQUE as IDENTIF17_0_0_ from SYSTEM.CLIENTS this_ where lower(this_.NOM)=?
  • 105. Quiz 15 : Solution Index de fonction Ne pas utiliser ilike/ignoreCase() Contrainte sur les valeurs de la table
  • 106. Quiz 15 : ORM/Framework Be aware sur le comportement des librairies utilisées
  • 107. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 108. Méthodologie Mesurez, ne devinez pas
  • 111. Avoir plateforme de test réaliste select * from t_conducteur left join t_voiture on id_conducteur=conducteur_fk where couleur = 'rouge' x 200
  • 112. Avoir plateforme de test réaliste Avoir un volume de données le plus proche possible de celui en production
  • 113. Avoir plateforme de test réaliste
  • 114. Avoir plateforme de test réaliste Avoir un serveur de base de données avec la configuration la plus proche possible de celle en production
  • 116. Récupérer les requêtes lentes et fréquentes
  • 117. Récupérer les requêtes lentes et fréquentes
  • 118. Récupérer les requêtes lentes et fréquentes A utiliser plutôt pour tuner le serveur de bases de données
  • 119. Récupérer les requêtes lentes et fréquentes Requête par requête ?
  • 120. Récupérer les requêtes lentes et fréquentes Requête par requête ?
  • 121. Récupérer les requêtes lentes et fréquentes
  • 122. Récupérer les requêtes lentes et fréquentes
  • 123. Récupérer les requêtes lentes et fréquentes
  • 125. Eliminer l'inutile Une requête rapide = une requête qui n'existe pas
  • 126. Eliminer l'inutile Attention aux n+1 select avec les ORM http://arodrigues.developpez.com/tutoriels/java/performance/hibernate- performance-part1-strategies-chargement/
  • 128. Eliminer l'inutile Ne récupérer que le nécessaire select * from clients Statistics ---------------------------------------------------------- 19 329 961 bytes sent via SQL*Net to client 100000 rows processed select nom,prenom from clients Statistics ---------------------------------------------------------- 2 351 810 bytes sent via SQL*Net to client 100000 rows processed
  • 129. Eliminer l'inutile Utiliser avec précaution des PreparedStatement à la place de Statement
  • 130. Eliminer l'inutile Purge des données inutiles
  • 131. Eliminer l'inutile Séparer les données courantes des données historiques
  • 133. Ajout d'index Sur quoi mettre un index ? clé étrangère clause where index couvrant order group by union distinct
  • 134. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas ? Conclusion
  • 135. Et si cela ne suffit pas ? Table space index bitmap schéma bdd IOT (Index Organised Table) Tuning du serveur de base de données ... Appeler un DBA
  • 136. Gestion des index SQL : Soyez AWARE ! Pourquoi optimiser les index Attention Un peu de théorie Quiz Méthodologie Et si cela ne suffit pas Conclusion