Вы находитесь на странице: 1из 17

lments d'optimisation et de tuning pour SQL Server 2000 et 2005

Par Rudi Bruchez

Date de publication : 17 juillet 2006

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

I - Analyser I-A - Utilisation du Gnrateur de Profils


Le gnrateur de profils (profiler en anglais) permet de tracer les requtes et divers vnements se produisant sur le serveur SQL Server. Il constitue un outil indispensable et incontournable dont la bonne utilisation transforme la vie du DBA et du dveloppeur. Nous allons en prsenter l'utilisation pour optimiser son code.

I-A-1 - Crer une trace

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.

Stored Procedures/SP:Recompile Objects/Object:Created et Objects/ Object:Deleted

Voici un exemple de trace gnre par le profiler :

Les colonnes contiennent, dans l'ordre :


-4Les 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

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

Ceci en cliquant sur le bouton Organize Columns

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.

I-B - Lecture du plan d'excution


Le plan d'excution est le rsultat auquel l'optimiseur arrive en analysant une requte, pour choisir son mode d'excution optimal, partir des donnes qui sont sa disposition : structure des tables, prsence d'index et de contraintes, statistiques de population des index et colonnes Afficher et dcrypter ce plan d'excution vous permet d'affiner la qualit de vos requtes et de corriger des problmes de structure, notamment d'absence d'index, ou de prsence d'index inutiliss. Vous pouvez obtenir ce plan soit visuellement, soit en texte. Inutile de dire que la premire version est bien plus conviviale au dcryptage. Pour obtenir le plan d'excution visuel dans SSMS (SQL Server Management Studio), vous avez un bouton de la barre d'outils SQL Editor ou clic droit sur la fentre d'dition de requte. Le plan d'excution estim de la requte slectionne peut tre affich avec un CTRL+L. Dans SQL Server 2005, l'affichage du plan d'excution graphique est gnr par l'envoi au serveur d'un SET STATISTICS XML ON. En version 2000, c'est un SET STATISTICS PROFILE ON. Le retour de ces commandes est le plan d'excution gnr par l'optimiseur, plus le nombre rel d'excutions de chaque tape, et le nombre de lignes retournes. Pour obtenir le plan d'excution texte :
-6Les 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 SHOWPLAN_TEXT ON ou SET SHOWPLAN_ALL ON SET STATISTICS PROFILE ON

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

I-B-2 - Les reads


Des statistiques complmentaires vous seront utiles pour juger des performances d'une requte. La principale est le nombre de pages lues par table prsente dans la requte. Cette information vous est retourne par SET STATISTICS IO ON. Exemple de retour de statistiques IO :
Table 'sysidxstats'. Scan count 6, logical reads 12, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

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

I-B-3 - Les flches


Les flches qui relient les diffrentes oprations reprsentent le flux de l'information extraite du moteur de stockage et trait pour obtenir le rsultat de la requte. Ce flux se lit de droite gauche, le rsultat final de la requte se trouvant en haut gauche du graphique. L'paisseur des flches vous permet en un coup d'il de dterminer les oprations les plus coteuses. Plus la flche est paisse, plus l'opration d'o elle provient a retourn de lignes. Considrez l'exemple ci-dessous :

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.

I-C - Obtenir d'autres statistiques


Vous pouvez utiliser SET STATISTICS TIME ON devant votre requte pour obtenir les statistiques de temps d'excution, en termes de temps CPU et de temps total. Le temps CPU peut vous donner une indication supplmentaire de la charge que votre requte fait subir au serveur. Le temps total vous indique, en regard du temps CPU, combien de temps a t utilis attendre sur des locks, ou transmettre les rsultats. Pour obtenir les statistiques constantes de l'excution d'une instruction, vous avez deux commandes votre disposition qui vous permettent, pour l'une de vider le cache de procdure (qui conserve le plan d'excution optimis des procdures stockes et des requtes ad hoc) :
DBCC FREEPROCCACHE

et pour l'autre, de vider le cache de donnes propres :


DBCC DROPCLEANBUFFERS

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.

I-D - Performance Monitor


Perfmon est l'outil de monitoring de Windows. l'installation de SQL Server, des indicateurs sont ajouts, qui permettent de surveiller l'activit du serveur SQL. Nous allons en prsenter les principaux pour obtenir une bonne ide de l'tat de sant de votre instance SQL.

-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

I-D-1 - Identification des connexions


Soudainement, vous voyez le ou les CPU de votre serveur monter en flche. Vous lancez une session de Profiler, et malgr cela vous n'arrivez pas identifier la source de la surcharge. Vous pouvez. Grce au Performance Monitor, identifier quelle connexion utilise le processeur intensivement. Comme c'est une opration qui prend un peu de temps, elle est surtout utile pour une connexion qui se conduit mal pendant au moins plusieurs minutes. Slectionnez, dans les indicateurs de Threads, les instances sqlservr/# pour les compteurs % Processor Time et ID Thread. Vous risquez malheureusement d'en avoir beaucoup sur un serveur de production.

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.

II-D - lments de requtes II-D-1 - Fonctions


Une erreur commune, qui peut affecter fortement les performances, est d'crire du code SQL avec la mme approche intellectuelle que pour l'criture de code procdural. Par exemple, en encapsulant une partie de la logique d'un SELECT dans une fonction (UDF, ou User Defined Function). Comme nous l'avons vu, le plan d'excution d'une requte SQL est optimis l'aide des informations que le moteur SQL dtient sur le systme et la structure des donnes. Sachant cela, il est important en crivant son code de faciliter le travail de l'optimiseur pour qu'il puisse crer le meilleur plan d'excution possible. Par exemple, dans un SELECT, en dplaant une partie des tables recherches dans une fonction, on enlve l'optimiseur la possibilit de comprendre les relations entre les tables. On oblige donc l'optimiseur passer dans la fonction pour chaque ligne retourne par le SELECT, ce qui se rvle trs contre-productif. Prenons un exemple simple, l'aide des tables d'AdventureWorks. Pour obtenir le total des taxes payes par territoire, la requte suivante remplit parfaitement son office :
SELECT st.Name as Territory, SUM(soh.TaxAmt) as TaxAmt FROM Sales.SalesOrderHeader soh JOIN Sales.SalesTerritory st ON soh.TerritoryID = st.TerritoryID GROUP BY st.Name ORDER BY st.Name

- 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.

II-D-2 - Verrous et niveau d'isolation


Une requte de type SELECT pour des verrous partags (shared locks) sur les donnes lues. Ces verrous partags permettent de garantir le niveau d'isolation par dfaut de la transaction qui est READ COMMITTED. En franais, cela veut dire que lorsque vous lisez un enregistrement, vous avez la garantie qu'il est propre, et que personne n'essaie de la modifier au mme moment. Il existe cinq (quatre dans SQL server 2000) niveaux d'isolation. Deux sont plus contraignants que l'isolation par dfaut, et deux moins contraignants. Vous pouvez baisser le niveau d'isolation pour permettre la lecture d'enregistrements sales (dirty reads), c'est-dire de lignes qui sont potentiellement en modification, qui font partie d'une transaction non encore termine, ou qui sont en cours de rollback. Vous prenez de ce fait le risque d'obtenir des donnes errones. En contrepartie, baisser votre niveau d'isolation vous permet d'augmenter les accs concurrentiels et dans certains cas d'augmenter les performances de traitement sur des serveurs trs sollicits. Le niveau d'isolation permettant les dirty reads s'appelle READ UNCOMMITTED. En READ UNCOMMITTED, une requte SELECT n'honore pas les verrous poss sur les enregistrements lus, et son tour ne pose pas de verrous partags. En me rptant, cela augmente les performances mais diminue la fiabilit de vos lectures de donnes. Utilisez donc ce niveau d'isolation en sachant ce que vous faites. Pour indiquer SQL server d'utiliser le niveau d'isolation READ UNCOMMITTED, vous pouvez soit modifier le niveau d'isolation de la connexion :

- 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/

Вам также может понравиться