SlideShare uma empresa Scribd logo
1 de 21
Comment utiliser le plan
d’exécution pour améliorer la
 performance des requêtes

                   2013
        Communauté .NET de Montréal


                 goo.gl/9AjiC
Pollus Brodeur
• www.linkedin.cominpollusb
• www.pollusbrodeur.com




                                goo.gl/9AjiC
Mise en situation typique




                    Démo

                  goo.gl/9AjiC
Mise en situation idéale
                                                   Analyse
                                                fonctionnelle




                  Déploiement                                             Développement




               Tests
                                                                               Révision du code
            acceptation




                                                                 Révision de
                                Test unitaire
                                                                performance




                                           goo.gl/9AjiC
Révision de performance de code ???
• Compiler les statistiques de performance
• Snapshot de l'état du système (Schéma, taille des tables, …)
• Recommandations de l'Architecte, DBA et du DEV
• Scénarios testés et rejetés




                                goo.gl/9AjiC
Métriques
• Temps
• IO reads, writes
• CPU
• Coût = fn(CPU, IO)
• Coût = fn(CPU, IO) sauf si UDF ou CLR




                                goo.gl/9AjiC
Le plan d’exécution se trouve…
• 3 types de plan d'exécution
   • Texte
   • Graphique
   • XML
• Comment extraire le plan
   1. SSMS
   2. DMV          Démo
   3. Profiler




                                goo.gl/9AjiC
Quoi chercher dans le plan d'execution ?
• Opérateurs coûteux
• Opérateurs SCAN
• Opérateurs HASH
• Lignes épaisses
• ORDER BY
• Large plan




                       goo.gl/9AjiC
L'exécution d'une requête
1.   Parsing
2.   Algebrizer
3.   Relational Engine
4.   Storage Engine




                         goo.gl/9AjiC
Opérateurs




             Autres opérateurs



               goo.gl/9AjiC
Search Arguments
• Filtre dans la clause WHERE qui permet d'utiliser un index

               LEFT(LastName, 1) = 'A'
               vs
               LastName like 'A%'


               YEAR(OrderDate) = 2004
               vs
               OrderDate between '2004-01-01' and '2004-12-31'




                                    Démo

                                  goo.gl/9AjiC
Les indexes
• Clustérisé = Dictionnaire
• Non-clustérisé = index de livre
• Covering = Tous se trouve dans l’index
• Filtered = Index partiel
• Indexed View = Vue matérialisée
• Full Text Catalog = Recherche de mots
• XML



                                goo.gl/9AjiC
Index clustérisé & non-clustérisé
• Index clustérisé est utilisé dans les indexes non-clustérisé.
• L'ordre des colonnes est important.
• Les champs INCLUDE ne sont pas triés.
                                                create table table1(
                                                col1 int primary key,
                                                col2 varchar(20),
                                                col3 int);

                                                -- Cet index
                                                create index idx1 on table1(col2)
                                                -- Sera le même que...
                                                create index idx2 on table1(col2, col1)


                                 goo.gl/9AjiC
Pourquoi un index n’est pas utilisé ?
• Les statistiques
• La sélectivité
• La densité         Démo

• La cardinalité
• Histogramme

  Un index n'est pas utilisé si la sélectivité de la
      colonne filtrée n'est pas assez élevé.

                            goo.gl/9AjiC
Hints
• Query hints
   •   MAXDOP
   •   OPTIMIZE FOR
   •   RECOMPILE          Démo
   •   KEEP PLAN
• Join hints
   • LOOP
   • MERGE
• Table hints
   • INDEX
   • FORCESEEK

                      goo.gl/9AjiC
Theoretical Query Execution Order
TQEO excluding UNION                        TQEO including UNION
1. FROM, JOIN, APPLY et ON                  1. FROM, JOIN, APPLY et ON
2. WHERE                                    2. WHERE
3. GROUP BY                                 3. GROUP BY
4. HAVING                                   4. HAVING
5. SELECT                                   5. TOP
6. ORDER BY                                 6. UNION et SELECT
7. TOP                                      7. ORDER BY
8. FOR XML                                  8. FOR XML

                             goo.gl/9AjiC
Autres pistes d'optimisation
• Nouveau code (MERGE, CROSS APPLY, etc)
• Schéma (tables, vues) et "Dénormalisation"
• Tri des données par le client
• Utiliser la cache du côté client
• Parallélisme MAXDOP
• Éviter les curseurs
• Vérifier si le plan est réutilisé avec Profiler SP:Cache Hit
• Partition (Entreprise)
• Compression (Entreprise)

                                  goo.gl/9AjiC
DMV
• Trouver les indexes non utilisés ou en double




                                goo.gl/9AjiC
Conclusion
• Prendre le temps de comparer (tester) plusieurs scénarios.
• Utiliser les nouvelles commandes.
• Suivre les recommandations & retirer ensuite les indexes non-utilisés
  ou en double (avec les DMV).
• Developpez un questionnaire pour vous permettre de réviser la
  performance du code.
• N'attendez pas après le DBA ou le DEV pour évaluer la performance.




                                goo.gl/9AjiC
Bibliographie
Thernstrom, Tobias. Weber, Ann. Hotek, Mike. (2009). MCTS Self-Paced
Training Kit (Exam 70-433) SQL Server 2008-Database Development.
Redmond, USA. 484 p.

Fritchey, Grant. (2012). SQL Server Execution Plans Second Edition,
Simple Talk Publishing, USA, 321 p. Link

Nevarez, Benjamin. (2010). Inside the SQL Server Query Optimizer,
Simple Talk Publishing, USA, 258 p.Link


                               goo.gl/9AjiC
Questions
• La présentation et les exemples seront disponible sur
  www.dotnetmontreal.com
• Résultat du sondage goo.gl/R3OHI
• Vous pouvez me rejoindre pollusb@gmail.com




                                goo.gl/9AjiC

Mais conteúdo relacionado

Semelhante a Comment utiliser le plan execution le plan execution

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
 
MapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMathieu Dumoulin
 
Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1Marc Bojoly
 
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...Sébastien Prunier
 
L'outillage git sous eclipse
L'outillage git sous eclipseL'outillage git sous eclipse
L'outillage git sous eclipseIgor Laborie
 
Pratiques de développement pour équipes Agile
Pratiques de développement pour équipes AgilePratiques de développement pour équipes Agile
Pratiques de développement pour équipes AgileAgile Tour 2009 Québec
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésMathieu Elie
 
Tdd en action - refactoring
Tdd en action - refactoringTdd en action - refactoring
Tdd en action - refactoringEric Mignot
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
Analyse de logs SEO : pour qui, pour quoi, comment ?
Analyse de logs SEO : pour qui, pour quoi, comment ?Analyse de logs SEO : pour qui, pour quoi, comment ?
Analyse de logs SEO : pour qui, pour quoi, comment ?Julien Deneuville
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesOxalide
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceLudovic Piot
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx FranceMarc Bojoly
 
YLT paris js - mars 2015
YLT paris js - mars 2015YLT paris js - mars 2015
YLT paris js - mars 2015gaelmetais
 
Integration continue - Introduction
Integration continue - IntroductionIntegration continue - Introduction
Integration continue - IntroductionOlivier ETIENNE
 

Semelhante a Comment utiliser le plan execution le plan execution (20)

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
 
MapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifiéMapReduce: Traitement de données distribué à grande échelle simplifié
MapReduce: Traitement de données distribué à grande échelle simplifié
 
Cerberus Testing
Cerberus TestingCerberus Testing
Cerberus Testing
 
Hello xcode 4 v2
Hello xcode 4 v2Hello xcode 4 v2
Hello xcode 4 v2
 
Hello Xcode 4 v2
Hello Xcode 4 v2Hello Xcode 4 v2
Hello Xcode 4 v2
 
Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1
 
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
Poitou Charentes JUG - Traçabilité dans une architecture distribuée avec Node...
 
L'outillage git sous eclipse
L'outillage git sous eclipseL'outillage git sous eclipse
L'outillage git sous eclipse
 
Pratiques de développement pour équipes Agile
Pratiques de développement pour équipes AgilePratiques de développement pour équipes Agile
Pratiques de développement pour équipes Agile
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautés
 
Tdd en action - refactoring
Tdd en action - refactoringTdd en action - refactoring
Tdd en action - refactoring
 
Rails 3 au Djangocong
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Analyse de logs SEO : pour qui, pour quoi, comment ?
Analyse de logs SEO : pour qui, pour quoi, comment ?Analyse de logs SEO : pour qui, pour quoi, comment ?
Analyse de logs SEO : pour qui, pour quoi, comment ?
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
 
YLT paris js - mars 2015
YLT paris js - mars 2015YLT paris js - mars 2015
YLT paris js - mars 2015
 
Integration continue - Introduction
Integration continue - IntroductionIntegration continue - Introduction
Integration continue - Introduction
 
REX Scrum mature
REX Scrum matureREX Scrum mature
REX Scrum mature
 

Comment utiliser le plan execution le plan execution

  • 1. Comment utiliser le plan d’exécution pour améliorer la performance des requêtes 2013 Communauté .NET de Montréal goo.gl/9AjiC
  • 2. Pollus Brodeur • www.linkedin.cominpollusb • www.pollusbrodeur.com goo.gl/9AjiC
  • 3. Mise en situation typique Démo goo.gl/9AjiC
  • 4. Mise en situation idéale Analyse fonctionnelle Déploiement Développement Tests Révision du code acceptation Révision de Test unitaire performance goo.gl/9AjiC
  • 5. Révision de performance de code ??? • Compiler les statistiques de performance • Snapshot de l'état du système (Schéma, taille des tables, …) • Recommandations de l'Architecte, DBA et du DEV • Scénarios testés et rejetés goo.gl/9AjiC
  • 6. Métriques • Temps • IO reads, writes • CPU • Coût = fn(CPU, IO) • Coût = fn(CPU, IO) sauf si UDF ou CLR goo.gl/9AjiC
  • 7. Le plan d’exécution se trouve… • 3 types de plan d'exécution • Texte • Graphique • XML • Comment extraire le plan 1. SSMS 2. DMV Démo 3. Profiler goo.gl/9AjiC
  • 8. Quoi chercher dans le plan d'execution ? • Opérateurs coûteux • Opérateurs SCAN • Opérateurs HASH • Lignes épaisses • ORDER BY • Large plan goo.gl/9AjiC
  • 9. L'exécution d'une requête 1. Parsing 2. Algebrizer 3. Relational Engine 4. Storage Engine goo.gl/9AjiC
  • 10. Opérateurs Autres opérateurs goo.gl/9AjiC
  • 11. Search Arguments • Filtre dans la clause WHERE qui permet d'utiliser un index LEFT(LastName, 1) = 'A' vs LastName like 'A%' YEAR(OrderDate) = 2004 vs OrderDate between '2004-01-01' and '2004-12-31' Démo goo.gl/9AjiC
  • 12. Les indexes • Clustérisé = Dictionnaire • Non-clustérisé = index de livre • Covering = Tous se trouve dans l’index • Filtered = Index partiel • Indexed View = Vue matérialisée • Full Text Catalog = Recherche de mots • XML goo.gl/9AjiC
  • 13. Index clustérisé & non-clustérisé • Index clustérisé est utilisé dans les indexes non-clustérisé. • L'ordre des colonnes est important. • Les champs INCLUDE ne sont pas triés. create table table1( col1 int primary key, col2 varchar(20), col3 int); -- Cet index create index idx1 on table1(col2) -- Sera le même que... create index idx2 on table1(col2, col1) goo.gl/9AjiC
  • 14. Pourquoi un index n’est pas utilisé ? • Les statistiques • La sélectivité • La densité Démo • La cardinalité • Histogramme Un index n'est pas utilisé si la sélectivité de la colonne filtrée n'est pas assez élevé. goo.gl/9AjiC
  • 15. Hints • Query hints • MAXDOP • OPTIMIZE FOR • RECOMPILE Démo • KEEP PLAN • Join hints • LOOP • MERGE • Table hints • INDEX • FORCESEEK goo.gl/9AjiC
  • 16. Theoretical Query Execution Order TQEO excluding UNION TQEO including UNION 1. FROM, JOIN, APPLY et ON 1. FROM, JOIN, APPLY et ON 2. WHERE 2. WHERE 3. GROUP BY 3. GROUP BY 4. HAVING 4. HAVING 5. SELECT 5. TOP 6. ORDER BY 6. UNION et SELECT 7. TOP 7. ORDER BY 8. FOR XML 8. FOR XML goo.gl/9AjiC
  • 17. Autres pistes d'optimisation • Nouveau code (MERGE, CROSS APPLY, etc) • Schéma (tables, vues) et "Dénormalisation" • Tri des données par le client • Utiliser la cache du côté client • Parallélisme MAXDOP • Éviter les curseurs • Vérifier si le plan est réutilisé avec Profiler SP:Cache Hit • Partition (Entreprise) • Compression (Entreprise) goo.gl/9AjiC
  • 18. DMV • Trouver les indexes non utilisés ou en double goo.gl/9AjiC
  • 19. Conclusion • Prendre le temps de comparer (tester) plusieurs scénarios. • Utiliser les nouvelles commandes. • Suivre les recommandations & retirer ensuite les indexes non-utilisés ou en double (avec les DMV). • Developpez un questionnaire pour vous permettre de réviser la performance du code. • N'attendez pas après le DBA ou le DEV pour évaluer la performance. goo.gl/9AjiC
  • 20. Bibliographie Thernstrom, Tobias. Weber, Ann. Hotek, Mike. (2009). MCTS Self-Paced Training Kit (Exam 70-433) SQL Server 2008-Database Development. Redmond, USA. 484 p. Fritchey, Grant. (2012). SQL Server Execution Plans Second Edition, Simple Talk Publishing, USA, 321 p. Link Nevarez, Benjamin. (2010). Inside the SQL Server Query Optimizer, Simple Talk Publishing, USA, 258 p.Link goo.gl/9AjiC
  • 21. Questions • La présentation et les exemples seront disponible sur www.dotnetmontreal.com • Résultat du sondage goo.gl/R3OHI • Vous pouvez me rejoindre pollusb@gmail.com goo.gl/9AjiC

Notas do Editor

  1. Ouvrir SSMS & SQL démarré ?GRANDE RESPIRATION… Suite de ma présentation du 14 octobre 2009Amis développeursLien sondage
  2. 15 ans exp. SQLPeud’exp. avec plan d’execution ->académiqueDBA plus que DEV
  3. Cycle de vie du logiciel
  4. KPI = Nb Exec, Coût Moyen, Qté IO, CPU, etc…État du système = Snapshot du schéma, Nb lignes dans les tables référencés, etc.Snapshot BD pour analyse
  5. Comparer avant & aprèsTemps:PerceptionDépends de l’état du BUFFER, du SYSTÈME ou BLOCAGEIO & CPU:Minimiser les ressources systèmeDiminuer IO -> Augmenter CPUQuel est la corrélation entre les 2 ?Coût:Coût ESTIMÉ et coût RÉELNe tiens pas compte des UDF ni CLR
  6. DMVProfiler = Performance – Showplan XML"List plan in the cache.sql"
  7. Parsing = F5Traduction en OBJECTID ->Query Hash, Processor Treeou SignatureRelational Engine -> Utilise les Stats pour produire un Query Plan OU réutilise un plan cachéStorage -> Révise le plan avant d'exécuter
  8. Merge = trié, 1 passeBoucle embriquéeHash = function MD5, CRC, Encryption A<> à
  9. Fonction sur les colonnesIl y a moyen de corriger les index"Exemple SearchArguments.sql"
  10. Le dictionnaire imaginaireDifférence entre dict. et index clustérisé = arbre BChercher mot qui commence par ENTCombien de mots commence par ENTCombien de mots termine par ENT
  11. Utiliser un champs de petite tailleExemple Nom, Prénom
  12. Cardinalité, Histogramme, String statisticsSelectivité haut = uniqueDensité = 1/SelectivitéExempleStatistiques
  13. OPTIMIZE FOR = parameter sniffingSQL 2000 -> RECOMPILE or KEEPFIXED PLAN
  14. Optimisateur peut changer l'ordre -> théorique
  15. Expliquer SearchArgChamps le plus petit possible, Clé artificielle
  16. Comment la performance est intégré dans votre entreprise ?