[xQuery] récupérations des index manquants via le plan d'exécution XML
Bonjour,
Mon but est de faire un script permettant de générer les commandes de création des index manquants à partir des plans d’exécutions présent dans le cache.
Je souhaite donc récupérer les différentes informations utiles à la création d'un index dans le fichier xml du plan d’exécution.
Exemple :
A partir du xml suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
...
<MissingIndexes>
<MissingIndexGroup Impact="99.8122">
<MissingIndex Database="[msdb]" Schema="[dbo]" Table="[sysssislog]">
<ColumnGroup Usage="EQUALITY">
<Column Name="[executionid]" ColumnId="7" />
</ColumnGroup>
<ColumnGroup Usage="INCLUDE">
<Column Name="[event]" ColumnId="2" />
<Column Name="[endtime]" ColumnId="9" />
<Column Name="[message]" ColumnId="12" />
</ColumnGroup>
</MissingIndex>
</MissingIndexGroup>
</MissingIndexes>
... |
J'aimerais obtenir un tableau du genre :
| Impacte |
Base |
Schéma |
Table |
Colonnes d'égalité/d'inégalité |
Colonnes Incluse |
|
|
|
|
|
|
Ou bien
| Impacte |
Base |
Schéma |
Table |
Colonne |
Type de colonne (Incluse, d'égalité,d'inégalité) |
|
|
|
|
|
|
Je me fou d'avoir une ligne par colonne, cela sera retraiter plus tard :)
N'étant pas à l'aise avec cette méthode, en m'appuyant sur différents articles j'ai écrit ce bout de code qui me permet de récupérer les premières informations :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
WITH XMLNAMESPACES (DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT Top 10
mi.value(N'(MissingIndexGroup/@Impact)[1]', N'varchar(128)') AS "impacte"
,mi.value(N'(MissingIndexGroup/MissingIndex/@Database)[1]', N'varchar(128)') AS "base"
,mi.value(N'(MissingIndexGroup/MissingIndex/@Schema)[1]', N'varchar(128)') As "schéma"
,mi.value(N'(MissingIndexGroup/MissingIndex/@Table)[1]', N'varchar(128)') As "table"
,mi.query('MissingIndexGroup/MissingIndex/ColumnGroup') As "Colonnes"
FROM sys.dm_exec_cached_plans As cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) As qp
CROSS APPLY qp.query_plan.nodes(N'//MissingIndexes') As MissingIndex(mi) |
Ce qui me permet d'obtenir l'impacte, la base, le schéma, et la table de manière précise ainsi qu'un nouveau xml avec la liste des colonnes :
Code:
1 2 3 4 5 6 7 8 9
|
<p1:ColumnGroup xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Usage="EQUALITY">
<p1:Column Name="[executionid]" ColumnId="7" />
</p1:ColumnGroup>
<p2:ColumnGroup xmlns:p2="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Usage="INCLUDE">
<p2:Column Name="[event]" ColumnId="2" />
<p2:Column Name="[endtime]" ColumnId="9" />
<p2:Column Name="[message]" ColumnId="12" />
</p2:ColumnGroup> |
Mais je ne parviens pas à extraire le détail de ces colonnes ... :(
Quelqu'un aurait-il pitié de moi svp ?