Подтвердить что ты не робот

SQL Server 2008 Проверьте, существует ли индекс

Возможный дубликат:
Список всех столбцов индекса и индекса в SQL Server DB

Я хотел бы знать, есть ли способ проверить, существует ли индекс в базе данных SQL Server для конкретной таблицы на основе имени столбца:

Скажем, я запустил следующий script:

  CREATE NONCLUSTERED INDEX [MyIndexName]
  ON [dbo].[MyTable] ([CustomerId])
  INCLUDE ([Id],[ModificationDate],[ProductId])
  GO

Теперь я хотел бы проверить, существует ли индекс на основе имени таблицы и столбцов (и столбцов в предложении include), а не фактического имени индекса.

(SQL Server 2008 R2)

Спасибо

4b9b3361

Ответ 1

Попробуйте этот запрос:

if exists(
           SELECT 1 
           FROM sys.indexes 
           WHERE name = 'INDEX' 
           AND object_id = OBJECT_ID('TABLENAME')
          )
 begin
 ....
 end

Ответ 2

Информация доступна в виде метаданных каталога, что-то вроде строк:

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'));

Это не дает ответ "да/нет", но показывает вам индексы, которые могут уже покрывать тот, который вы планируете. Вам необходимо учитывать как положение клавиш, так и направление клавиш и включенные столбцы с перекрывающимися перекрытиями (индекс на крышках (K1, K2) (K1) и индекс, который включает (C1, C2, C3) охватывает (C1, C3) Для реальной производственной системы вам нужно будет рассмотреть такие вещи, как неявно включенные столбцы (например, кластерные ключи индекса), выражения индексного фильтра и различия в пространстве данных индекса (т.е. Partitioninig)