Beruflich Dokumente
Kultur Dokumente
Nous allons passer en revue quelques lments de base de tuning et d'optimisation pour SQL Server 2000 et 2005, qui, je l'espre, pourront tre utiles pour permettre de dtecter rapidement les problmes de performances de code T-SQL. L'article est compos de deux parties : la premire traitant de l'analyse des problmes, la seconde de quelques lments de correction.
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
I - Analyser...................................................................................................................................................................3 I-A - Utilisation du Gnrateur de Profils...............................................................................................................3 I-A-1 - Crer une trace..................................................................................................................................... 3 I-A-2 - vnements........................................................................................................................................... 4 I-A-3 - Filtrage................................................................................................................................................... 5 I-A-4 - Groupement........................................................................................................................................... 6 I-A-5 - Conclusion............................................................................................................................................. 6 I-B - Lecture du plan d'excution...........................................................................................................................6 I-B-1 - Le scan.................................................................................................................................................. 7 I-B-2 - Les reads...............................................................................................................................................8 I-B-3 - Les flches............................................................................................................................................ 9 I-C - Obtenir d'autres statistiques.......................................................................................................................... 9 I-D - Performance Monitor..................................................................................................................................... 9 I-D-1 - Identification des connexions.............................................................................................................. 11 II - Rsoudre.............................................................................................................................................................. 12 II-A - Index............................................................................................................................................................12 II-A-1 - Couverture.......................................................................................................................................... 12 II-B - Recompilation..............................................................................................................................................14 II-C - Statistiques..................................................................................................................................................14 II-D - lments de requtes.................................................................................................................................15 II-D-1 - Fonctions............................................................................................................................................ 15 II-D-2 - Verrous et niveau d'isolation.............................................................................................................. 16 III - Conclusion...........................................................................................................................................................17
-2Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Aprs ouverture du profiler et cration d'une nouvelle trace, l'cran ci-dessus apparat. Vous voyez ici que vous pouvez utiliser un template, qui vous fournira une configuration existante ou sauvegarde par vous auparavant. Vous pouvez sauvegarder le rsultat de la trace dans un fichier ou une table de base de donnes. Si vous ne faites pas ce choix cette tape, vous pourrez toujours effectuer cette sauvegarde sur votre trace arrte. Vous pouvez galement indiquer une heure d'arrt de la trace. C'est utile pour la faire tourner automatiquement, en exportant son script de cration pour le crer sur le serveur et en planifier le lancement : dans le menu File/Fichier.
Le deuxime onglet de la fentre de cration de trace vous permet de slectionner les vnements recevoir.
-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Vous voyez sur la copie d'cran les vnements slectionns pour le template par dfaut. Pour le sujet qui nous intresse, les vnements d'audit de scurit sont inutiles, vous pouvez donc les enlever, ainsi que les connexions existantes, qui afficheront une suite de lignes au lancement de la session de profilage seulement.
I-A-2 - vnements
Beaucoup d'vnements sont votre disposition. Vous pouvez les slectionner en cochant Show all events . Voici une liste non exhaustive d'vnements intressants pour le profilage de performances : vnement Errors and Warning/ Exception Locks/Locks:Timeout Description Vous permet de tracer les erreurs SQL provenant de votre code. Timeout d'attente sur les verrous, peuttre le signe d'une mauvaise stratgie de requtage, notamment impliquant des transactions trop longues. Trace les recompilations de procdures. La colonne Object Name contient le nom de la procdure. En ajoutant ObjectType et ObjectName, et en filtrant par ObjectType 17, vous pouvez tracer la cration et la suppression de tables temporaires.
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
le type d'vnement, ici la compltion d'un batch de commandes SQL ; le code SQL envoy au serveur ; le login de l'utilisateur ; la dure de la requte en temps CPU (millisecondes) ; le nombre de pages lues par l'excution de la requte ; le nombre de pages crites ; la dure totale d'excution en millisecondes ; le ClientProcessId, qui correspond l'id du process de l'application sur la machine cliente (hostprocess dans sysprocesses) ; le SPID (System Server Process Id) : l'id de la connexion ouverte sur SQL Server.
I-A-3 - Filtrage
Sur un serveur sollicit, l'affichage du profiler peut se remplir de milliers de lignes par seconde. Il est donc utile de filtrer les vnements. Cliquez sur le bouton Column Filters
Vous voyez ici un filtre par nom de Login. Vous pouvez aussi filtrer par SPID, pour isoler une connexion (en sachant que le SPID est rattribu de connexion en connexion), par Hostname pour isoler une machine cliente, par ClientProcessId pour isoler une application cliente travers toutes ses connexions ouvertes. Le filtrage sur les colonnes numriques vous permet galement de ne retourner que les requtes ayant par exemple consomm plus d'un certain temps CPU, ou effectu un nombre minimum de reads. Cela se rvle trs utile pour isoler les requtes les plus coteuses. Nouveaut dans le profiler 2005 : la case cocher exclude rows that do not contain values , qui vous permet d'amliorer la pertinence de vos filtres. Dans le profiler 2000, les lignes dont la colonne filtre a une valeur vide sont affiches quand mme.
-5Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
I-A-4 - Groupement
Vous pouvez galement grouper vos vnements sur les colonnes de votre choix, ce qui vous permet de changer l'ordre d'affichage des vnements et de les regrouper pour un mme login, SPID, ou ClientProcessId
I-A-5 - Conclusion
Le profiler est un outil d'usage quotidien de premire importance, qui vous permet tout moment de vous rendre compte de la charge de votre serveur et d'isoler le code SQL le plus gourmand en ressources. Lorsque vous avez trouv ces requtes indsirables, vous pouvez en copier-coller l'appel dans SSMS pour analyser son plan d'excution.
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Plan estim. Le mme plan avec les nombres de lignes affectes, et le nombre d'excutions de chaque oprateur.
SQL Server 2005 ajoute des versions XML de ces commandes. Chaque instruction du batch ou de la slection sur laquelle vous affichez le plan d'excution prsente videmment son propre plan d'excution, vous aurez donc dans ce cas plusieurs plans l'un aprs l'autre. Dans ce cas, chaque plan se voit attribuer un pourcentage de charge relative la totalit des instructions, nomm cot relatif. Ce cot relatif est une information trs utile qui vous permet de vous concenter rapidement sur les requtes les plus coteuses lorsque vous voulez analyser les performances d'un batch d'instructions, par exemple l'excution d'une ou plusieurs procdures stockes appeles en squence. Le pourcentage obtenu est une estimation prenant en compte les divers lments du plan d'excution disposition. Il ne s'agit pas d'un rapport rel bas par exemple sur le temps CPU de chaque opration, puisque cette information n'est pas rcupre pour ce plan (rappelons que les informations du plan visuel sont bases sur un SET STATISTICS PROFILE ON). Pour identifier rapidement les problmes dans un plan d'excution visuel, concentrez-vous sur trois lments : les pourcentages de charge sur chaque opration, les scans de table, et l'paisseur des flches qui relient les oprations. Le pourcentage de chaque opration est tout comme le pourcentage total de charge du plan, une estimation. Il vous indique toutefois de manire trs fiable quelles oprations sont les plus coteuses.
I-B-1 - Le scan
Le scan de la table diffre du seek. Le scan est le parcours du contenu d'une table ou du dernier niveau d'un index. Une table tant physiquement une liste doublement lie (un pointeur sur l'enregistrement prcdent, un pointeur sur l'enregistrement suivant), SQL Server choisit de parcourir chaque enregistrement et d'y tester le critre dsir (s'il y en a un). Si c'est pour trouver une ligne dans une table de dix mille enregistrements, il y a, l'vidence, un problme d'optimisation. Si la table ne comporte aucun index, c'est le comportement obligatoire de SQL Server, il n'a pas d'autre choix. Le seek reprsente le parcours d'un index. Un index est une structure arborescente balance (b-tree). Dfinition de b-tree emprunte alaide.com : Mthode de structuration pour le stockage et l'accs aux donnes. Elle consiste diviser les possibilits de choix en deux parts gales et tablir des pointeurs vers les deux sous-blocs. De cette faon, pour rechercher un lment, on le compare d'abord avec l'lment de la tte de l'arbre. Si l'lment recherch est celui-l, la recherche est termine, sinon soit elle est plus grande, soit plus petite ; dans l'un ou l'autre cas on continue la recherche dans le sous-bloc correspondant en utilisant le pointeur appropri. En d'autres termes, si un index est prsent et comporte une ou plusieurs colonnes prsentes dans le critre de recherche, l'optimiseur peut choisir d'utiliser l'index, donc de parcourir l'arbre pour atteindre le pointeur vers l'enregistrement de la base (en cas d'index non ordonn), au lieu de parcourir chaque enregistrement. Dans le plan d'excution visuel, le scan est diffrenci du seek par l'icne :
Scan de table ;
-7Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Scan d'index ;
Seek d'index. Le scan de table n'intervient que sur une table de type heap (tas), c'est--dire une table qui ne comporte pas d'index ordonn. Un index ordonn force la distribution physique des enregistrements. Un scan d'index ordonn quivaut donc un scan de table, certes plus efficace lorsqu'on cherche dans la cl de l'index ordonn. Vous pouvez utiliser la requte suivante (valable pour SQL Server 2005) pour savoir si vos tables comportent ou non un index ordonn :
SELECT t.name as tableName, i.type_desc as tableType FROM sys.indexes i JOIN sys.tables t ON i.object_Id = t.object_Id WHERE i.index_id < 2 ORDER BY t.name
Sur chaque ligne de ces statistiques, vous obtenez le nom de la table, le nombre de scans effectus sur la table, et les nombres de lectures. Pour vos besoins d'optimisation, les lectures logiques vous donnent l'information dont vous avez besoin. L'unit ici est la page. La page SQL Server est l'unit de base et en mme temps l'unit maximale de stockage d'un enregistrement (avec quelques exceptions en SQL Server 2005 notamment pour les colonnes de type varchar). Elle est dimensionne 8 ko. Une page peut contenir plusieurs enregistrements, mais un enregistrement ne peut pas tre contenu dans plus d'une page, ce qui limite concrtement la taille de vos enregistrements 8060 octets (les blobs text et images sont stocks de faon diffrente, et SQL Server 2005 offre un mcanisme pour s'affranchir de cette limite pour les colonnes de type (n)varchar et varbinary). Lorsque le moteur de stockage de SQL Server lit des enregistrements sur le disque ou en cache, il lit des pages. La lecture sur disque est l'opration la plus coteuse d'une requte, il est donc important de limiter le nombre de pages lues, en s'assurant d'avoir assez de RAM pour permettre SQL Server de stocker les pages les plus frquemment accdes dans son cache, et plus important, en limitant le nombre de pages lues par la cration d'index ou l'optimisation du code SQL. Les lectures logiques affiches par SET STATISTICS IO ON vous indiquent le nombre total de pages lues sur chaque table implique dans la requte. Concentrez-vous sur les nombres les plus levs, observez les parties du plan d'excution qui affichent les oprations sur ces tables, et si vous y voyez des scans, rflchissez la possibilit de crer un index.
-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Vous pouvez voir que la flche du bas est bien plus paisse que celle du haut. Simplement parce que l'opration du bas (le Hash Join de droite) retourne 56 000 lignes, alors que la paralllisation du haut traite 26 lignes. Concentrezvous sur les sources de flches les plus grosses en priorit pour amliorer les performances de votre requte.
c'est--dire les donnes en cache qui ont dj t crites sur le disque. Aprs l'excution de ces deux commandes, votre code sera recompil et les pages de donnes seront lues sur le disque. N'utilisez pas ces commandes sur un serveur de production, moins de vouloir faire une farce votre quipe de support.
-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
La situation idale de monitoring dans mon exprience a t la mise disposition de deux crans. Ainsi, sur le deuxime cran, j'ai toujours visible l'tat du serveur. J'ai cr deux fentres du Performance Monitor, l'une avec les CPU individuels, et la moyenne des CPU en gras (les indicateurs sont dans processor\% Processor Time). Pour diminuer la charge du serveur, j'ai baiss la frquence de rcupration d'infos trois secondes. Cette fentre s'affiche en graphe. Dans l'autre fentre, j'affiche les indicateurs de mmoire et de disque, en l'occurrence :
LogicalDisk % Disk Read Time % Disk Write Time Avg. Disk Queue Length Memory Cache Faults/sec SQLServer:Buffer Manager Buffer cache hit ratio Page Reads/sec
Le Avg. Disk Queue Length est un bon indicateur pour dterminer si les IO physiques (donc le disque) sont rellement un goulot d'tranglement. Si cet indicateur est constamment lev, vous avez un problme. Le regarder avec le Buffer cache hit ratio vous donne une bonne ide de la source du problme : disque physique ou RAM. Pour lancer facilement les deux fentres en un seul clic, voici l'exemple d'un script WSH :
Option Explicit Dim oWsh : Set oWsh = CreateObject("WScript.Shell") oWsh.Run "mmc ""C:\mypath\CPU.msc""" oWsh.Run "mmc ""C:\mypath\SQL MEMORY AND DISK.msc""" Set oWsh = Nothing
- 10 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Affichez ensuite le rsultat sous forme de rapport (CTRL+R) afin d'amliorer la lisibilit.
Si vous identifiez un processus qui maintient un pourcentage lev de CPU, notez son ID Thread. Il correspond la colonne kpid de la table systme sysprocesses de la base master de SQL Server 2000, ou de la vue systme sys.sysprocesses dans SQL Server 2005. Voici un exemple de requte pour obtenir les informations de processus :
SELECT blocked, lastwaittype, waittime, DB_NAME(dbid) as db, hostname, loginame, cmd, last_batch, cpu FROM master.sys.sysprocesses WHERE kpid = 1792
- 11 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
II - Rsoudre
Aprs avoir parcouru les outils permettant d'identifier les problmes, comment faire pour les rsoudre ? C'est encore un domaine complexe, nous allons simplement nous concentrer sur les rponses videntes.
II-A - Index
Les index sont indispensables sur les tables de plus de quelques enregistrements. Pour autant, ils ne doivent pas tre crs lgrement. Indexer toutes les colonnes d'une table par simple principe de prcaution est une erreur qui vous cotera en performances (et en espace disque). En effet, chaque index ralentit les oprations d'insertion et de modification de donnes, et c'est logique : l'index doit tre maintenu. Mais que cela ne vous fasse pas peur pour crer vos index ncessaires. SQL server est trs performant pour maintenir ses index. Comment savoir quel index crer, quelle colonne indexer ? Lorsque vous avez regard le plan d'excution d'une requte, vous avez identifi les tables qui sont scannes, et celles qui retournent beaucoup d'enregistrements. Vous devez naturellement vous concentrer sur celles-l. Il existe un assistant qui peut vous rendre de grands services pour l'indexation de vos tables, il s'agit du Database Engine Tuning Advisor, prsent dans le menu Tools de SSMS (SQL Server Management Studio). Il tait appel Index Tuning Wizard dans SQL Server 2000. Cet outil analyse vos requtes (un batch slectionn dans votre fentre d'dition, ou le rsultat d'une trace ralise avec le profiler) pour vous suggrer la cration d'index, et ajoute ces index pour vous si vous le souhaitez. Comme cet article est destin vous donner des notions d'optimisation, nous utiliserons plutt ici notre cerveau. Mais mme ainsi, il est trs utile de lancer aprs coup le DETA pour comparer les rsultats ou voir s'il a d'autres suggestions nous faire. En laissant votre souris sur une opration de scan du plan d'excution, ou en affichant la fentre de proprits, vous verrez la liste de prdicats de recherche, ainsi que la liste des colonnes retournes. La liste des prdicats va vous donner les colonnes indexer. Attention, toutes les colonnes ne sont pas des candidates gales l'indexation, parce que mme si un index existe sur une colonne, SQL Server ne va pas forcment l'utiliser dans une recherche. La cration d'un index s'accompagne de la cration de statistiques de distribution des donnes de la colonne. En d'autres termes, SQL Server conserve des statistiques de remplissage des valeurs de la colonne, afin d'estimer combien d'enregistrements va retourner une requte comportant une clause de recherche sur cette colonne. Si le nombre d'enregistrements retourner est trop important par rapport au nombre total d'enregistrements de la table, SQL server choisira probablement le scan, estimant qu'il est moins coteux de parcourir la table une fois que de parcourir de multiples fois l'arbre de l'index. C'est particulirement vrai pour un index non ordonn, o il faut ajouter le cot du bookmark lookup. La commande DBCC SHOW_STATISTICS ('NomdeTable', 'NomdIndex') vous permet de voir les statistiques maintenues sur un index. Le chiffre intressant voir dans les rsultats de cette commande est la densit. La densit reprsente un ratio des valeurs identiques dans la colonne. Plus la densit est leve, moins la slectivit de l'index l'est, et moins l'index est intressant. Par exemple, crer un index sur une colonne de type bit (valeurs possibles : 1, 0, NULL) n'est intressant que s'il y a peu d'occurrences d'une des deux valeurs (0 ou 1), et qu'on cherche justement les enregistrements qui ont cette valeur. Sinon, l'index ne sera trs certainement pas utilis.
II-A-1 - Couverture
Pour certaines requtes qui retournent peu de colonnes, la technique de l'index couvrant (covering index) peut amliorer trs nettement les performances, en vitant l'opration lourde du bookmark lookup. Couvrir une requte, c'est crer un index non ordonn dont la cl est compose de toutes les colonnes retournes par la requte, en plaant bien sr les colonnes cherches par la clause WHERE en premier. Voici un exemple en trois temps, d'un SELECT sur une table de la base de dmonstration de Microsoft : AdventureWorks. Comparons les plans d'excution d'une mme requte :
- 12 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez SELECT CarrierTrackingNumber, UnitPrice FROM Sales.SalesOrderDetail WHERE UnitPrice = 5.7
Ce qui doit retourner 210 lignes sur un total de 121 317. Premirement, en laissant les index par dfaut sur la table :
Vous noterez que, cause de l'absence d'index sur la colonne UnitPrice, l'optimiseur est oblig de choisir un scan de la table. Donc, crons un index sur cette colonne :
CREATE NONCLUSTERED INDEX nix$Sales_SalesOrderDetail$UnitPrice ON Sales.SalesOrderDetail (UnitPrice)
Notons au passage que cette opration est aussi traite par l'optimiseur, son propre plan d'excution :
Remarquez l'paisseur des flches. 121 317 lignes sont traiter. Lanons ensuite la mme requte :
Ici, une forme de bookmark lookup adapte aux tables comportant un index ordonn. SQL server 2005 choisit de parcourir l'index ordonn pour chaque ligne trouve depuis l'index que nous venons de crer. Chaque enregistrement trouv dans l'index est recherch dans la table par l'index ordonn. Cela provoque donc 210 parcours de l'index ordonn. Modifions notre index pour couvrir les besoins de la requte :
DROP INDEX Sales.SalesOrderDetail.nix$Sales_SalesOrderDetail$UnitPrice GO CREATE NONCLUSTERED INDEX nix$Sales_SalesOrderDetail$UnitPrice_CarrierTrackingNumber ON Sales.SalesOrderDetail (UnitPrice, CarrierTrackingNumber) GO
Rexcutons :
- 13 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Ici toutes les colonnes de la requte ont pu tre servies par l'index. SQL server n'a aucun besoin d'aller chercher des informations supplmentaires dans la table.
II-B - Recompilation
Un lment parfois cach qui peut diminuer vos performances est la recompilation en milieu d'excution d'une procdure stocke. Pourquoi diable une procdure se recompilerait-elle, et comment lui taper sur les doigts ? Il ne faut pas : elle a bien raison. Une procdure se recompile lorsque les conditions de sa premire compilation changent. Cela peut arriver de plusieurs faons, le plus couramment lorsqu'une table temporaire est cre dans la procdure, et que sa structure est modifie ou que le nombre de ses enregistrements change significativement, ou lorsque vous changez l'intrieur de la procdure certains settings de la connexion, par exemple le format de date l'aide de SET DATETIME. Pour tracer les ventuelles recompilations grce au profiler, utilisez les vnements de Stored Procedure suivants : SP:Recompile, SP:Starting, SP:Completed. En y ajoutant SP:StmtStarting et SP:StmtCompleted, vous pourrez tracer plus finement quelle instruction dans la procdure stocke a dclench la recompilation : le SP:Recompile se trouvera entre SP:StmtStarting et le SP:StmtCompleted correspondant. Depuis le service pack 2 de SQL Server 2000, l'vnement SP:Recompile retourne la raison de la recompilation dans la colonne EventSubClass. Les valeurs retournes sont expliques dans cet article. Pour viter ces recompilations, ou en diminuer les effets, suivez ces quelques rgles : prfixez tous vos objets par dbo. dans SQL Server 2000. Cela vitera SQL server de poser des locks de compilation au lancement de la procdure pour dterminer si les objets contenus dans la procdure ont le mme propritaire que la procdure stocke ; vitez de modifier les options de la connexion l'intrieur de la procdure, telles que les SET ANSI, SET DATETIME utilisez (parcimonieusement !) l'option de requte KEEPFIXED PLAN pour viter les recompilations dues des mises jour de statistiques ; essayez autant que possible de vous passer des tables temporaires.
II-C - Statistiques
Nous l'avons vu, l'optimiseur se base sur des statistiques de distribution pour juger de la stratgie adopter. Par dfaut, SQL Server maintient automatiquement ses statistiques, en le crant au besoin, et en les recalculant lorsqu'un nombre significatif de lignes de la table a t modifi. Si vous dsirez vous assurer que les statistiques sont prsentes, ouvrez les proprits de votre base de donnes, et regardez la valeur de Auto Create Statistics et Auto Update Statistics.
- 14 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Une autre faon de tracer l'absence de statistiques est d'utiliser le Profiler, vnement Errors and Warnings/Missing Column Statistics. Vous le voyez galement le warning dans un plan d'excution visuel, et un clic droit sur l'icne vous permet de crer les statistiques manquantes.
- 15 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez
Pas trs sophistiqu n'est-ce pas ? Pourquoi ne pas encapsuler cette recherche de total dans une fonction que nous pourrons rutiliser ?
CREATE FUNCTION Sales.GetTaxAmtPerTerritory (@TerritoryID int) RETURNS money AS BEGIN DECLARE @TaxAmt money SELECT @TaxAmt = SUM(TaxAmt) FROM Sales.SalesOrderHeader WHERE TerritoryID = @TerritoryID END RETURN @TaxAmt
C'est le bonheur, nous avons rempli notre devoir de programmeur en faisant du code rutilisable. Relanons notre requte :
SELECT st.Name as Territory, Sales.GetTaxAmtPerTerritory (st.TerritoryID) as TaxAmt FROM Sales.SalesTerritory st ORDER BY st.Name
Si l'ide nous prend de comparer les performances des deux requtes, voici ce que nous obtenons :
La premire version (SUM et JOIN) dure une seconde et effectue 1227 lectures de pages. La seconde 7052 lectures de pages en un peu moins de six secondes. CQFD.
- 16 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/
lments d'optimisation et de tuning pour SQL Server 2000 et 2005 par Rudi Bruchez SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
En le remettant dans l'tat o vous l'avez trouv la fin de votre code (notamment dans une procdure stocke) :
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Vous pouvez aussi le spcifier dans votre requte pour une table en particulier :
SELECT st.Name as Territory, SUM(soh.TaxAmt) as TaxAmt FROM Sales.SalesOrderHeader soh WITH (READUNCOMMITTED) JOIN Sales.SalesTerritory st ON soh.TerritoryID = st.TerritoryID GROUP BY st.Name ORDER BY st.Name
Le mot-cl READUNCOMMITTED est un synonyme de NOLOCK. Vous verrez sans doute plus souvent WITH (NOLOCK). READUNCOMMITTED est simplement SQL ANSI, NOLOCK est un mot-cl T-SQL. Les effets sont strictement identiques. SQL Server 2005 introduit un niveau d'isolation plus concurrentiel encore, appel SNAPSHOT. Bas sur une technologie de version de ligne (row versioning), il ncessite que l'option ALLOW_SNAPSHOT_ISOLATION de votre base de donnes soit ON. Pour faire simple, une copie des donnes est stocke dans une table temporaire de tempdb, avec une information de version. Lorsque vous lisez les donnes dans ce niveau d'isolation, cette version des lignes est cre et utilise, et aucun verrou n'est pos sur la table originale. De plus, la lecture dans une transaction de niveau SNAPSHOT est consistante avec l'tat des donnes au moment de la cration de cette transaction. En interne, SQL server conserve une version des donnes au moment de la cration de votre transaction. Si vous modifiez des donnes dans ce niveau d'isolation, SQL Server adopte un mode de verrouillage optimiste, et les lignes modifier ne seront verrouilles qu'au moment de la modification. ce moment, si les lignes ont t modifies entre temps (SQL server le sait, toujours grce son mcanisme de row-versioning), votre transaction sera automatiquement annule (donc votre mise jour). Il est donc plus prudent de limiter l'utilisation de ce niveau d'isolation la lecture de donnes.
III - Conclusion
Les lments prsents ici ne sont en rien exhaustifs, et ils reprsentent une compilation de concepts et d'outils dont il vous est libre d'approfondir l'usage. Pour une comprhension plus pousse des concepts noncs ici, je vous recommande la lecture des livres de Sajal Dam (SQL Server Query Performance Tuning Distilled), de Kalen Delaney et de Ken Henderson.
- 17 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Rudi Bruchez. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://rudi.developpez.com/sqlserver/tutoriel/optimisation/