Aujourd’hui j’ai bien avancé dans mon projet de refonte, je regarde mes post-it et vois « Mettre en place les indexes » que j’ai collé là par inadvertance en début de projet, dans l’espoir je l’avoue qu’un D.B.A. passe par ici et que je n’ai pas à mettre le nez là-dedans.
Le temps est passé et pas de D.B.A. en vue, je me colle donc à cette tâche ingrate dans l’optique de ne pas les auto-générer à l’aveuglette. (En mode suivant suivant suivant by Microsoft :p )
Donc ma première difficulté est, comment trouver les indexes manquants ?
Google nous conseille un rapport datant de SQL 2005 le: « SQL Server 2005 Performance Dashboard Reports » qu’il faut modifier afin qu’il soit compatible avec SQL Server 2008 … bref n’ayant pas besoin de tous ça, je passe mon chemin.
Mon attention c’est ensuite porté sur les DMVs concernant les Missing Index pour finalement s’arrêter sur le bas de cette page de MSDN : http://msdn.microsoft.com/en-us/library/ms345364.aspx qui nous donne le script suivant:
Example script to see missing indexes AS used BY Microsoft Customer Support PRINT 'Missing Indexes: ' PRINT 'The "improvement_measure" column is an indicator of the (estimated) improvement that might ' PRINT 'be seen if the index was created. This is a unitless number, and has meaning only relative ' PRINT 'the same number for other indexes. The measure is a combination of the avg_total_user_cost, ' PRINT 'avg_user_impact, user_seeks, and user_scans columns in sys.dm_db_missing_index_group_stats.' PRINT '' PRINT '-- Missing Indexes --' SELECT CONVERT(VARCHAR, getdate(), 126) AS runtime ,mig.index_group_handle ,mid.index_handle ,CONVERT(DECIMAL(28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) AS improvement_measure ,'CREATE INDEX missing_index_' + CONVERT(VARCHAR, mig.index_group_handle) + '_' + CONVERT(VARCHAR, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL(mid.equality_columns, '') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL(mid.inequality_columns, '') + ')' + ISNULL(' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement ,migs.* ,mid.database_id ,mid.[object_id] FROM sys.dm_db_missing_index_groups mig INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle WHERE CONVERT(DECIMAL(28, 1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10 ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC PRINT '' GO
Cette requête nous fournit plusieurs informations sympathiques tel que:
- Improvement Measure: Un indicateur permettant de voir l’apport théorique de la création de l’index.
- Create Index Statement : La requête de création d’index, attention, la moindre des choses serais de donner un nom un peu plus éloquent.
A partir de là, nous avons donc une base de travail afin de pouvoir choisir les indexes à créer.
Conclusion:
- Ne créez pas tous les indexes conseillé par SQL Server, trop d’indexes tuent l’index !
- Testez l’impact de vos indexes après création.
- Ne faites jamais ça :