Gestion des index SQL : Soyez          AWARE !Antonio Gomes Rodrigues
Antonio Gomes Rodrigues@ra0077Consultant chez AliecomRédacteur pour developpez.comConférencier                0
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Pourquoi optimiser les index               Les problèmes de               bases de données               sont régulièremen...
Pourquoi optimiser les indexJPA/Hibernate, Spring JDBC et JDBC ont pourpoint commun de générer des requêtes SQL
Pourquoi optimiser les index
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Attention : DBA, cest un métier
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Théorie : Etude de cas
Théorie : Un index, cest quoi ?
Théorie : Un index, cest quoi ?Représentation triée des éléments indexés à        laide dun arbre équilibré
Théorie : Un index, cest quoi ?
Théorie : Un index, comment ça marche ?
Théorie : Plan dexecutionexplain plan for select nom,prenom from clients where sex = MALEselect * from table(dbms_xplan.di...
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : Plan dexecution
Théorie : CBOEt comment le plan dexécution est décidé ?
Théorie : CBOCBO = Cost Based Optimizer
Théorie : Info sur les index dune tableselect index_name, index_type, uniquenessfrom user_indexeswhere table_name = CLIENTS;
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Quiz 1 : ?
Quiz 1 : Explication  Re équilibrer larbre  Ecrire à au moins deux endroits  (table et index)
Quiz 1 : ?
Quiz 1 : Explication  Plus dindex != meilleur perf  Il suffit dun seul
Quiz 1: Nombre dindex                          Plus dindex != plus de performance                          Et donc il faut...
Quiz 2 : ?                  Lindex est il utilisé ?create table CLIENTS ....create index pk_clients on clients(id_client)s...
Quiz 2 : RéponseNon
Quiz 2 : Explication  Index sur clé primaire crée  automatiquement dans Oracle.  SQL> create index pk_clients on  clients(...
Quiz 2 : Index par défaut  Be aware sur la politique de création  dindex par défaut
Quiz 3 : ?                        Pourquoi lindex nest pas utilisé ?create index ix_clientx_pays on clients(pays)select no...
Quiz 3 : Indice-----------------------------------------------------------------------------| Id    | Operation          |...
Quiz 3 : Explication
Quiz 3 : Solutioncreate index ix_clientx_pays2on clients(upper(pays))
Quiz 3 : SolutionPLAN_TABLE_OUTPUT--------------------------------------------------------------------------------|    0 |...
Quiz 3 : ?             Lindex est il utilisé ?create index ix_clientx_sex on clients(sex)select nom,prenom from clients wh...
Quiz 3 : Indice
Quiz 3 : Réponse                            Non---------------------------------------------------------------------------...
Quiz 3 : Index de fonction   Be aware lors de lutilisation de   fonction dans les requêtes SQL
Quiz 4 : ?                         Pourquoi lindex nest pas utilisé ?create index ix_clientx_sex on clients(sex)select nom...
Quiz 4 : Explication
Quiz 4 : SolutionCREATE INDEX index_null ONclients (sex, 1)
Quiz 4 : Solution---------------------------------------------------------------------------------------| Id   | Operation...
Quiz 4 : Indexer les null  Be aware à ne pas oublier les  contraintes dans le schéma de bdd  Be aware aux valeurs null  Bi...
Quiz 5 : ?                        Existe t il un meilleur index ?create index clients_identifiant_unique_ix onclients(iden...
Quiz 5 : Indicecreate index clients_identifiant_unique_ix onclients(identifiant_unique)select id_client from clients where...
Quiz 5 : Explication
Quiz 5 : Solutioncreate unique indexclients_identifiant_unique_ixonclients(identifiant_unique)
Quiz 5 : Solution--------------------------------------------------------------------------------|     0 | SELECT STATEMEN...
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 lindex nest pas utilisé ?create index ix_clientx_sex on clients(sex)select nom,...
Quiz 6 : IndiceCBO = Cost Based Optimizer
Quiz 6 : Explicationselect count(*) from clients where sex = MALE-> 51% des lignes
Quiz 6 : PreuveSi on change la répartition (de 51% à 8,5%)----------------------------------------------------------------...
Quiz 6 : Répartition des données      Be aware sur la validité dun index au      cours de sa vie      Superviser votre ser...
Quiz 7 : ?             Lindex est il utilisé ?create index ix_clientx_sex on clients(sex)select nom,prenom from clients wh...
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   ...
Quiz 8 : ?                        Pourquoi lindex nest pas utilisé ?create index ix_clientx_sex on clients(sex)# Ajout de ...
Quiz 8 : IndiceCBO = Cost Based Optimizer
Quiz 8 : Explication CBO se base sur des données obsolètes pour faire le choix du plan dexécution de la requête
Quiz 8 : SolutionEXECdbms_stats.gather_table_stats(SYSTEM,Clients,cascade=>TRUE);-----------------------------------------...
Quiz 8 : StatistiquesNe pas oublier de faire régulièrementdes update statNe pas oublier de faire des updatestats après un ...
Quiz 9 : ?                        Existe t il un meilleur index ?create index clients_nom_ix on clients(nom)select nom, pr...
Quiz 9 : Indice
Quiz 9 : Solutioncreate index clients_nom_prenom_ix on clients(nom,prenom)
Quiz 9 : Solutioncreate index clients_nom_prenom_ix onclients(nom,prenom)-------------------------------------------------...
Quiz 9 : Index couvrant Be aware de lexistence des index couvrants Be aware au coût de gestion dun index couvrant
Quiz 10 : ?                        Pourquoi lindex nest pas utilisé ?create index clients_id_unique_nom_ix onclients(ident...
Quiz 10 : Explication
Quiz 10 : Solutioncreate index rev_clients_id_unique_nom_ix onclients(reverse(identifiant_unique),nom)select nom from clie...
Quiz 10 : Accès aux données    Be aware lors de lécriture des    requêtes
Quiz 11 : ?                        Pourquoi lindex nest pas utilisé ?create index ix_clients_num_rue onclients(numero_de_r...
Quiz 11 : Indice
Quiz 11 : Indice-----------------------------------------------------------------------------| Id    | Operation          ...
Quiz 11 : Explication  Oracle fait une conversion  automatique
Quiz 11 : Solutionselect 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     ...
Quiz 12 : ?                        Pourquoi lindex nest pas utilisé ?create index achats_prix_ix on achats(prix);select co...
Quiz 12 : Explication
Quiz 12 : Solutionselect count(*) from achats where prix = 500 - 10-------------------------------------------------------...
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 achatsB : select count(1) from achats
Quiz 13 : Solutionselect count(*) from achats-----------------------------------------------------------------------------...
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)sele...
Quiz 14 : IndiceIndex = Représentation triée des élémentsindexés à laide dun arbre équilibré
Quiz 14 : Indicecreate index achats_p_id on achats(prix,id_achat)select prix,id_achat from achats where prix > 30 orderby ...
Quiz 14 : Solutioncreate index achats_p_id2 on achats(prix asc,id_achatdesc)----------------------------------------------...
Quiz 14 : Ordre des index   Be aware sur lordre des index et   lordre daccès aux données
Quiz 15 : ?             Pourquoi lindex nest pas utilisé ?create index clients_n_ix on clients(nom)
Quiz 15 : Indice
Quiz 15 : Indice
Quiz 15 : ExplicationHibernate:    /* criteria query */ select        this_.ID_CLIENT as ID1_0_0_,        this_.NOM as NOM...
Quiz 15 : SolutionIndex de fonctionNe 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 indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Méthodologie   Mesurez, ne devinez pas
Méthodologie
Méthodologie
Avoir plateforme de test réalisteselect * from t_conducteurleft join t_voiture on id_conducteur=conducteur_fkwhere couleur...
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 pos...
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équentesA utiliser plutôt pourtuner le serveur debases 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 linutileUne requête rapide = une requête qui nexiste pas
Eliminer linutileAttention aux n+1 select avec les ORMhttp://arodrigues.developpez.com/tutoriels/java/performance/hibernat...
Eliminer linutileUtiliser des caches
Eliminer linutileNe récupérer que le nécessaireselect * from clientsStatistics--------------------------------------------...
Eliminer linutileUtiliser avec précaution des PreparedStatement à la place de Statement
Eliminer linutilePurge des données inutiles
Eliminer linutileSéparer les données courantesdes données historiques
Méthodologie
Ajout dindexSur quoi mettre un index ?                                clé étrangère                                clause ...
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Et si cela ne suffit pas ?Table spaceindex bitmapschéma bddIOT (Index Organised Table)Tuning du serveur de base de données...
Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne s...
Conclusion BE AWARE
Gestion des index SQL : Soyez  AWARE !
Prochain SlideShare
Chargement dans…5
×

Gestion des index SQL : Soyez AWARE !

1 298 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 298
Sur SlideShare
0
Issues des intégrations
0
Intégrations
260
Actions
Partages
0
Téléchargements
20
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Gestion des index SQL : Soyez AWARE !

  1. 1. Gestion des index SQL : Soyez AWARE !Antonio Gomes Rodrigues
  2. 2. Antonio Gomes Rodrigues@ra0077Consultant chez AliecomRédacteur pour developpez.comConférencier 0
  3. 3. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  4. 4. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  5. 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 dune application Java
  6. 6. Pourquoi optimiser les indexJPA/Hibernate, Spring JDBC et JDBC ont pourpoint commun de générer des requêtes SQL
  7. 7. Pourquoi optimiser les index
  8. 8. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  9. 9. Attention : DBA, cest un métier
  10. 10. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  11. 11. Théorie : Etude de cas
  12. 12. Théorie : Un index, cest quoi ?
  13. 13. Théorie : Un index, cest quoi ?Représentation triée des éléments indexés à laide dun arbre équilibré
  14. 14. Théorie : Un index, cest quoi ?
  15. 15. Théorie : Un index, comment ça marche ?
  16. 16. Théorie : Plan dexecutionexplain plan for select nom,prenom from clients where sex = MALEselect * 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)
  17. 17. Théorie : Plan dexecution
  18. 18. Théorie : Plan dexecution
  19. 19. Théorie : Plan dexecution
  20. 20. Théorie : Plan dexecution
  21. 21. Théorie : Plan dexecution
  22. 22. Théorie : Plan dexecution
  23. 23. Théorie : Plan dexecution
  24. 24. Théorie : Plan dexecution
  25. 25. Théorie : Plan dexecution
  26. 26. Théorie : CBOEt comment le plan dexécution est décidé ?
  27. 27. Théorie : CBOCBO = Cost Based Optimizer
  28. 28. Théorie : Info sur les index dune tableselect index_name, index_type, uniquenessfrom user_indexeswhere table_name = CLIENTS;
  29. 29. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  30. 30. Quiz 1 : ?
  31. 31. Quiz 1 : Explication Re équilibrer larbre Ecrire à au moins deux endroits (table et index)
  32. 32. Quiz 1 : ?
  33. 33. Quiz 1 : Explication Plus dindex != meilleur perf Il suffit dun seul
  34. 34. Quiz 1: Nombre dindex Plus dindex != plus de performance Et donc il faut trouver le bon indexMaking ofhttp://blog.aliecom.com/pourquoi-il-faut-faire-attention-au-nombre-dindex-sql/
  35. 35. Quiz 2 : ? Lindex est il utilisé ?create table CLIENTS ....create index pk_clients on clients(id_client)select id_client from clients where id_client = 5
  36. 36. Quiz 2 : RéponseNon
  37. 37. 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
  38. 38. Quiz 2 : Index par défaut Be aware sur la politique de création dindex par défaut
  39. 39. Quiz 3 : ? Pourquoi lindex nest 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 |-----------------------------------------------------------------------------
  40. 40. 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)
  41. 41. Quiz 3 : Explication
  42. 42. Quiz 3 : Solutioncreate index ix_clientx_pays2on clients(upper(pays))
  43. 43. Quiz 3 : SolutionPLAN_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--------------------------------------------------------------------------------
  44. 44. Quiz 3 : ? Lindex est il utilisé ?create index ix_clientx_sex on clients(sex)select nom,prenom from clients where UPPER(sex) =MALE
  45. 45. Quiz 3 : Indice
  46. 46. 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 |-----------------------------------------------------------------------------
  47. 47. Quiz 3 : Index de fonction Be aware lors de lutilisation de fonction dans les requêtes SQL
  48. 48. Quiz 4 : ? Pourquoi lindex nest 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)
  49. 49. Quiz 4 : Explication
  50. 50. Quiz 4 : SolutionCREATE INDEX index_null ONclients (sex, 1)
  51. 51. 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)
  52. 52. 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
  53. 53. Quiz 5 : ? Existe t il un meilleur index ?create index clients_identifiant_unique_ix onclients(identifiant_unique);select id_client from clients where identifiant_uniquelike 109876545210387;--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 || 1 | TABLE ACCESS BY INDEX ROWID| CLIENTS | 1 ||* 2 | INDEX RANGE SCAN | CLIENTS_IDENTIFIANT_UNIQUE_IX | 4 |--------------------------------------------------------------------------------
  54. 54. Quiz 5 : Indicecreate index clients_identifiant_unique_ix onclients(identifiant_unique)select id_client from clients where identifiant_uniquelike 109876545210387
  55. 55. Quiz 5 : Explication
  56. 56. Quiz 5 : Solutioncreate unique indexclients_identifiant_unique_ixonclients(identifiant_unique)
  57. 57. 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)
  58. 58. 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
  59. 59. Quiz 6 : ? Pourquoi lindex nest 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)
  60. 60. Quiz 6 : IndiceCBO = Cost Based Optimizer
  61. 61. Quiz 6 : Explicationselect count(*) from clients where sex = MALE-> 51% des lignes
  62. 62. Quiz 6 : PreuveSi 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)|--------------------------------------------------------------------------------
  63. 63. Quiz 6 : Répartition des données Be aware sur la validité dun index au cours de sa vie Superviser votre serveur de base de données
  64. 64. Quiz 7 : ? Lindex est il utilisé ?create index ix_clientx_sex on clients(sex)select nom,prenom from clients where sex is null
  65. 65. Quiz 7 : Indice
  66. 66. Quiz 7 : Explication
  67. 67. 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
  68. 68. Quiz 8 : ? Pourquoi lindex nest pas utilisé ?create index ix_clientx_sex on clients(sex)# Ajout de données dans la table clientsselect 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 |-----------------------------------------------------------------------------
  69. 69. Quiz 8 : IndiceCBO = Cost Based Optimizer
  70. 70. Quiz 8 : Explication CBO se base sur des données obsolètes pour faire le choix du plan dexécution de la requête
  71. 71. Quiz 8 : SolutionEXECdbms_stats.gather_table_stats(SYSTEM,Clients,cascade=>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)|--------------------------------------------------------------------------------
  72. 72. Quiz 8 : StatistiquesNe pas oublier de faire régulièrementdes update statNe pas oublier de faire des updatestats après un gros changement dedonnées (update, insert, delete)
  73. 73. 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--------------------------------------------------------------------------------
  74. 74. Quiz 9 : Indice
  75. 75. Quiz 9 : Solutioncreate index clients_nom_prenom_ix on clients(nom,prenom)
  76. 76. Quiz 9 : Solutioncreate index clients_nom_prenom_ix onclients(nom,prenom)--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 38 | 570 | 2 (0)||* 1 | INDEX RANGE SCAN| CLIENTS_NOM_PRENOM_IX | 38 | 570 | 2 (0)|--------------------------------------------------------------------------------
  77. 77. Quiz 9 : Index couvrant Be aware de lexistence des index couvrants Be aware au coût de gestion dun index couvrant
  78. 78. Quiz 10 : ? Pourquoi lindex nest pas utilisé ?create index clients_id_unique_nom_ix onclients(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 |-----------------------------------------------------------------------------
  79. 79. Quiz 10 : Explication
  80. 80. Quiz 10 : Solutioncreate index rev_clients_id_unique_nom_ix onclients(reverse(identifiant_unique),nom)select nom from clients wherereverse(identifiant_unique) like 1%
  81. 81. Quiz 10 : Accès aux données Be aware lors de lécriture des requêtes
  82. 82. Quiz 11 : ? Pourquoi lindex nest pas utilisé ?create index ix_clients_num_rue onclients(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 |-----------------------------------------------------------------------------
  83. 83. Quiz 11 : Indice
  84. 84. 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)
  85. 85. Quiz 11 : Explication Oracle fait une conversion automatique
  86. 86. Quiz 11 : Solutionselect nom, prenom from clients where numero_de_rue = 1
  87. 87. Quiz 11 : Conversion automatique Be aware aux conversions automatiques Be aware lors de la création du schéma de bdd
  88. 88. Quiz 12 : ? Pourquoi lindex nest 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 |-----------------------------------------------------------------------------
  89. 89. Quiz 12 : Explication
  90. 90. Quiz 12 : Solutionselect 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)|--------------------------------------------------------------------------------
  91. 91. Quiz 12 : Accès aux données Be aware lors de lécriture des requêtes
  92. 92. Quiz 13 : ? Quel est la requête la plus rapide ?A : select count(*) from achatsB : select count(1) from achats
  93. 93. Quiz 13 : Solutionselect 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 |-----------------------------------------------------------------------------
  94. 94. Quiz 13 : Astuces sur Internet Méfiez vous des "astuces" trouvées sur Internet Mesurez, ne devinez pas
  95. 95. 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 orderby 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)|-------------------------------------------------------------------------------------
  96. 96. Quiz 14 : IndiceIndex = Représentation triée des élémentsindexés à laide dun arbre équilibré
  97. 97. Quiz 14 : Indicecreate index achats_p_id on achats(prix,id_achat)select prix,id_achat from achats where prix > 30 orderby 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)|-------------------------------------------------------------------------------------
  98. 98. Quiz 14 : Solutioncreate index achats_p_id2 on achats(prix asc,id_achatdesc)---------------------------------------------------------------------------------| 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 |---------------------------------------------------------------------------------
  99. 99. Quiz 14 : Ordre des index Be aware sur lordre des index et lordre daccès aux données
  100. 100. Quiz 15 : ? Pourquoi lindex nest pas utilisé ?create index clients_n_ix on clients(nom)
  101. 101. Quiz 15 : Indice
  102. 102. Quiz 15 : Indice
  103. 103. Quiz 15 : ExplicationHibernate: /* 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)=?
  104. 104. Quiz 15 : SolutionIndex de fonctionNe pas utiliser ilike/ignoreCase()Contrainte sur les valeurs de la table
  105. 105. Quiz 15 : ORM/Framework Be aware sur le comportement des librairies utilisées
  106. 106. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  107. 107. Méthodologie Mesurez, ne devinez pas
  108. 108. Méthodologie
  109. 109. Méthodologie
  110. 110. Avoir plateforme de test réalisteselect * from t_conducteurleft join t_voiture on id_conducteur=conducteur_fkwhere couleur = rouge x 200
  111. 111. Avoir plateforme de test réaliste Avoir un volume de données le plus proche possible de celui en production
  112. 112. Avoir plateforme de test réaliste
  113. 113. 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
  114. 114. Méthodologie
  115. 115. Récupérer les requêtes lentes et fréquentes
  116. 116. Récupérer les requêtes lentes et fréquentes
  117. 117. Récupérer les requêtes lentes et fréquentesA utiliser plutôt pourtuner le serveur debases de données
  118. 118. Récupérer les requêtes lentes et fréquentes Requête par requête ?
  119. 119. Récupérer les requêtes lentes et fréquentes Requête par requête ?
  120. 120. Récupérer les requêtes lentes et fréquentes
  121. 121. Récupérer les requêtes lentes et fréquentes
  122. 122. Récupérer les requêtes lentes et fréquentes
  123. 123. Méthodologie
  124. 124. Eliminer linutileUne requête rapide = une requête qui nexiste pas
  125. 125. Eliminer linutileAttention aux n+1 select avec les ORMhttp://arodrigues.developpez.com/tutoriels/java/performance/hibernate-performance-part1-strategies-chargement/
  126. 126. Eliminer linutileUtiliser des caches
  127. 127. Eliminer linutileNe récupérer que le nécessaireselect * from clientsStatistics---------------------------------------------------------- 19 329 961 bytes sent via SQL*Net to client 100000 rows processedselect nom,prenom from clientsStatistics---------------------------------------------------------- 2 351 810 bytes sent via SQL*Net to client 100000 rows processed
  128. 128. Eliminer linutileUtiliser avec précaution des PreparedStatement à la place de Statement
  129. 129. Eliminer linutilePurge des données inutiles
  130. 130. Eliminer linutileSéparer les données courantesdes données historiques
  131. 131. Méthodologie
  132. 132. Ajout dindexSur quoi mettre un index ? clé étrangère clause where index couvrant order group by union distinct
  133. 133. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pas ?Conclusion
  134. 134. Et si cela ne suffit pas ?Table spaceindex bitmapschéma bddIOT (Index Organised Table)Tuning du serveur de base de données...Appeler un DBA
  135. 135. Gestion des index SQL : Soyez AWARE !Pourquoi optimiser les indexAttentionUn peu de théorieQuizMéthodologieEt si cela ne suffit pasConclusion
  136. 136. Conclusion BE AWARE

×