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