SQL Server 2008 vérifier l'existence d'un index [dupliquer]
Double Possible:
liste de toutes les colonnes index & index dans la base de données SQL Server
je voudrais savoir s'il y a un moyen de vérifier si un index existe dans une base de données SQL Server pour une table spécifique basée sur le nom des colonnes:
disons que je lance le script suivant:
CREATE NONCLUSTERED INDEX [MyIndexName]
ON [dbo].[MyTable] ([CustomerId])
INCLUDE ([Id],[ModificationDate],[ProductId])
GO
Maintenant, je voudrais vérifier si l'index basé sur le nom de la table et les colonnes (et les colonnes de la inclure la clause), pas le nom de l'index réel.
(SQL Server 2008 R2)
Merci
2 réponses
Essayez cette requête:
if exists(
SELECT 1
FROM sys.indexes
WHERE name = 'INDEX'
AND object_id = OBJECT_ID('TABLENAME')
)
begin
....
end
L'information est disponible dans le catalogue metadata views, quelque chose comme:
select ...
from sys.indexes i
join sys.index_columns ic on i.object_id = ic.object_id
and i.index_id = ic.index_id
join sys.columns c
on ic.object_id = c.object_id
and ic.index_column_id = c.column_id
where i.object_id = object_id('MyTable')
and (c.name = 'CustomerId' and ic.key_ordinal = 1 and ic.is_descending_key = 0)
or (ic.is_included_column = 1 and c.name in ('Id', 'ModificationDate', 'ProductId'));
ceci ne produit pas une réponse oui/non mais vous montre les index qui pourraient déjà couvrir celui que vous planifiez. Vous devez tenir compte à la fois de la position clé, de la direction clé et des colonnes incluses, avec des chevauchements de couverture (un index sur (K1, K2) couvre (K1), et un index qui comprend (C1, C2, C3) couvre (C1, C3). Pour un système de production réel, vous devez considérez des choses comme des colonnes implicitement incluses (par ex. les clés d'index groupées), les expressions de filtre d'index et les différences dans l'espace de données d'index (c.-à-d. partitioninig)--2-->