Как удалить все индексы, кроме первичных ключей, одним запросом - PullRequest
4 голосов
/ 23 сентября 2011

Я планирую удалить все индексы, кроме первичных ключей.Я сделал первичные ключи сам, но все остальные индексы были предложением SQL Server.

После удаления всех индексов, которые не являются первичными ключами, планируется использовать шаблон настройки профилировщика SQL Server для советника по настройке базы данных и создавать индексы.

При таком способе планирования не использовать неиспользуемые индексы или индексы, снижающие производительность.

Насколько это логично?Спасибо.

Ответы [ 2 ]

12 голосов
/ 23 сентября 2011
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'DROP INDEX ' 
    + QUOTENAME(SCHEMA_NAME(o.[schema_id]))
    + '.' + QUOTENAME(o.name) 
    + '.' + QUOTENAME(i.name) + ';'
    FROM sys.indexes AS i
    INNER JOIN sys.tables AS o
    ON i.[object_id] = o.[object_id]
WHERE i.is_primary_key = 0
AND i.index_id <> 0
AND o.is_ms_shipped = 0;

PRINT @sql;
-- EXEC sp_executesql @sql;
5 голосов
/ 23 сентября 2011

Самый простой способ, вероятно, таков: запустите этот запрос, который выведет список DROP INDEX ..... операторов.

SELECT 
   'DROP INDEX ' + name + ' ON ' + 
   OBJECT_SCHEMA_NAME(object_id) + '.' + OBJECT_NAME(object_Id) 
FROM sys.indexes
WHERE is_primary_key = 0
AND name IS NOT NULL
AND OBJECT_SCHEMA_NAME(object_id) <> 'sys'

Скопируйте эти операторы DROP из таблицы результатов в новое окно запроса, проверьте их, возможно, измените их, а затем запустите, чтобы фактически отбросить индексы.

...