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

Comment utiliser le plan execution le plan execution

  • 1.
    Comment utiliser leplan 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 situationtypique Démo goo.gl/9AjiC
  • 4.
    Mise en situationidé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 performancede 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 • IOreads, 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écutionse 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 dansle 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 • Filtredans 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 indexn’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 ExecutionOrder 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 lesindexes non utilisés ou en double goo.gl/9AjiC
  • 19.
    Conclusion • Prendre letemps 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ésentationet 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

Notes de l'éditeur

  • #2 Ouvrir SSMS & SQL démarré ?GRANDE RESPIRATION… Suite de ma présentation du 14 octobre 2009Amis développeursLien sondage
  • #3 15 ans exp. SQLPeud’exp. avec plan d’execution ->académiqueDBA plus que DEV
  • #5 Cycle de vie du logiciel
  • #6 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
  • #7 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
  • #8 DMVProfiler = Performance – Showplan XML"List plan in the cache.sql"
  • #10 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
  • #11 Merge = trié, 1 passeBoucle embriquéeHash = function MD5, CRC, Encryption A<> à
  • #12 Fonction sur les colonnesIl y a moyen de corriger les index"Exemple SearchArguments.sql"
  • #13 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
  • #14 Utiliser un champs de petite tailleExemple Nom, Prénom
  • #15 Cardinalité, Histogramme, String statisticsSelectivité haut = uniqueDensité = 1/SelectivitéExempleStatistiques
  • #16 OPTIMIZE FOR = parameter sniffingSQL 2000 -> RECOMPILE or KEEPFIXED PLAN
  • #17 Optimisateur peut changer l'ordre -> théorique
  • #18 Expliquer SearchArgChamps le plus petit possible, Clé artificielle
  • #22 Comment la performance est intégré dans votre entreprise ?