Voici une requête qui nous permet de retrouver pour tout index :
- la liste de ses colonnes clé
- la liste de ses colonnes incluses
- la définition de son filtre
- le script de création de cet index
Voici une première requête qui retourne la définition de tous les index d’une base de données.
On peut bien sûr ajouter des filtres afin de voir la définition des index sur une table, ou la définition d’un index en particulier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | ------------------------------- -- Nicolas Souquet - 22/02/2011 ------------------------------- SELECT DISTINCT S.name AS schema_name , T.name AS table_name , I.name AS index_name , LEFT(KC.key_column_list, LEN(KC.key_column_list) - 1) AS key_column_list , LEFT(KCI.included_key_column_list, LEN(KCI.included_key_column_list) - 1) AS included_key_column_list , REPLACE(REPLACE(REPLACE(REPLACE(I.filter_definition, '[', ''), ']', ''), '(', ''), ')', '') AS filter_definition FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id INNER JOIN sys.indexes AS I ON T.object_id = I.object_id INNER JOIN sys.index_columns AS IC ON IC.object_id = I.object_id AND IC.index_id = I.index_id INNER JOIN sys.columns AS C ON IC.object_id = C.object_id AND IC.column_id = C.column_id CROSS APPLY ( SELECT CS.name + ',' FROM sys.columns AS CS INNER JOIN sys.index_columns AS ICS ON CS.object_id = ICS.object_id AND CS.column_id = ICS.column_id WHERE IC.object_id = ICS.object_id AND IC.index_id = ICS.index_id AND ICS.is_included_column = 0 ORDER BY ICS.index_column_id FOR XML PATH ('') ) AS KC (key_column_list) OUTER APPLY ( SELECT CSI.name + ',' FROM sys.columns AS CSI INNER JOIN sys.index_columns AS ICSI ON CSI.object_id = ICSI.object_id AND CSI.column_id = ICSI.column_id WHERE IC.object_id = ICSI.object_id AND IC.index_id = ICSI.index_id AND ICSI.is_included_column = 1 ORDER BY ICSI.index_column_id FOR XML PATH ('') ) AS KCI (included_key_column_list) WHERE S.name = 'dbo' --AND T.name = 'maTable' --AND I.name = 'monIndex' ORDER BY T.name, I.name |
Et une autre donnant le script de définition de l’index :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | ------------------------------- -- Nicolas Souquet - 22/02/2011 ------------------------------- ;WITH CTE AS ( SELECT DISTINCT S.name AS schema_name , T.name AS table_name , I.name AS index_name , LEFT(KC.key_column_list, LEN(KC.key_column_list) - 1) AS key_column_list , LEFT(KCI.included_key_column_list, LEN(KCI.included_key_column_list) - 1) AS included_key_column_list , REPLACE(REPLACE(REPLACE(REPLACE(I.filter_definition, '[', ''), ']', ''), '(', ''), ')', '') AS filter_definition , ROW_NUMBER() OVER(ORDER BY T.name, I.name) AS n FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id INNER JOIN sys.indexes AS I ON T.object_id = I.object_id INNER JOIN sys.index_columns AS IC ON IC.object_id = I.object_id AND IC.index_id = I.index_id INNER JOIN sys.columns AS C ON IC.object_id = C.object_id AND IC.column_id = C.column_id CROSS APPLY ( SELECT CS.name + ',' FROM sys.columns AS CS INNER JOIN sys.index_columns AS ICS ON CS.object_id = ICS.object_id AND CS.column_id = ICS.column_id WHERE IC.object_id = ICS.object_id AND IC.index_id = ICS.index_id AND ICS.is_included_column = 0 ORDER BY ICS.index_column_id FOR XML PATH ('') ) AS KC (key_column_list) OUTER APPLY ( SELECT CSI.name + ',' FROM sys.columns AS CSI INNER JOIN sys.index_columns AS ICSI ON CSI.object_id = ICSI.object_id AND CSI.column_id = ICSI.column_id WHERE IC.object_id = ICSI.object_id AND IC.index_id = ICSI.index_id AND ICSI.is_included_column = 1 ORDER BY ICSI.index_column_id FOR XML PATH ('') ) AS KCI (included_key_column_list) WHERE S.name = 'dbo' --AND T.name = 'maTable' --AND I.name = 'monIndex' ) SELECT 'CREATE INDEX ' + index_name + ' ON ' + schema_name + '.' + table_name + '(' + key_column_list + ')' + CASE WHEN included_key_column_list IS NOT NULL THEN ' INCLUDE(' + included_key_column_list + ')' ELSE '' END + CASE WHEN filter_definition IS NOT NULL THEN ' WHERE ' + filter_definition ELSE '' END FROM CTE |