SQL: включить новый столбец в индекс

#sql #sql-server #ddl #database-indexes

#sql #sql-server #ddl #база данных-индексы

Вопрос:

У меня есть некластеризованный индекс по двум строкам в таблице, который включает в себя несколько столбцов. Индекс используется представлением, и теперь представление обновлено, чтобы включить другой столбец. Обычно я записываю изменения базы данных, чтобы они сначала проверялись, если изменение уже было применено, что, очевидно, означает, например, что столбец не добавляется несколько раз случайно при повторном запуске скрипта.

Я хочу добавить новый столбец в индекс, удалив и воссоздав его (если только нет способа включить дополнительный столбец без повторного создания индекса). Но я хотел бы сначала проверить, содержит ли индекс столбец. Есть ли простой способ проверить?

Ответ №1:

Я думаю, что это предоставит список столбцов для всех ваших индексов (с указанием имени таблицы, имени индекса и имени столбца). Я полагаю, что я правильно установил связи между ними, но, пожалуйста, проверьте вручную (например, протестируйте его на индексе без столбца, а затем на новой версии индекса со столбцом).

Затем вы можете добавить предложения where/IF EXISTS / etc по желанию.

 SELECT  so.name AS [TableName],
        si.name AS [IndexName],
        sc.name AS [IndexColumnName]
FROM    sys.indexes AS si
INNER JOIN sys.objects AS so ON so.object_id = si.object_id AND is_ms_shipped = 0
INNER JOIN sys.index_columns AS sic ON si.object_id = sic.object_id AND si.index_id = sic.index_id
INNER JOIN sys.columns AS sc ON sic.object_id = sc.object_id AND sic.column_id = sc.column_id
  

Обратите внимание, что sys.index_columns в нем есть поле is_included_column (равное 1 или 0), которое вы можете использовать, чтобы определить, является ли оно «включенной» частью индекса, если требуется.