Ответ 1
Попробуйте этот запрос:
if exists(
SELECT 1
FROM sys.indexes
WHERE name = 'INDEX'
AND object_id = OBJECT_ID('TABLENAME')
)
begin
....
end
Возможный дубликат:
Список всех столбцов индекса и индекса в SQL Server DB
Я хотел бы знать, есть ли способ проверить, существует ли индекс в базе данных SQL Server для конкретной таблицы на основе имени столбца:
Скажем, я запустил следующий script:
CREATE NONCLUSTERED INDEX [MyIndexName]
ON [dbo].[MyTable] ([CustomerId])
INCLUDE ([Id],[ModificationDate],[ProductId])
GO
Теперь я хотел бы проверить, существует ли индекс на основе имени таблицы и столбцов (и столбцов в предложении include), а не фактического имени индекса.
(SQL Server 2008 R2)
Спасибо
Попробуйте этот запрос:
if exists(
SELECT 1
FROM sys.indexes
WHERE name = 'INDEX'
AND object_id = OBJECT_ID('TABLENAME')
)
begin
....
end
Информация доступна в виде метаданных каталога, что-то вроде строк:
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)