我打算刪除除主鍵以外的所有索引。我自己創建了主鍵,但所有其他索引都是SQL Server的建議。如何刪除主鍵除單鍵查詢外的所有索引
刪除所有不是主鍵的索引後,計劃爲數據庫調整顧問程序使用SQL Server分析器調整模板並創建索引。
用這種方法計劃沒有未使用的索引或性能下降索引。
這是多合乎邏輯? 謝謝。
我打算刪除除主鍵以外的所有索引。我自己創建了主鍵,但所有其他索引都是SQL Server的建議。如何刪除主鍵除單鍵查詢外的所有索引
刪除所有不是主鍵的索引後,計劃爲數據庫調整顧問程序使用SQL Server分析器調整模板並創建索引。
用這種方法計劃沒有未使用的索引或性能下降索引。
這是多合乎邏輯? 謝謝。
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;
最簡單的方法可能是這樣的:運行這個查詢將輸出一個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語句,檢查他們,也許調整它們,然後運行它們實際下降指數。
只是關於相信所有系統對象都在sys架構中的評論......如果您意外地在MSDB或master中運行此代碼,您將返回不在sys架構中的系統對象的行。只要記住一點 - 您可以通過使用'OBJECTPROPERTY(object_id,'IsMsShipped')= 0'來輕鬆解決這個問題。 –
@AaronBertrand:謝謝 - 您的解決方案的效果肯定比我的解決方案更好 - 我將不得不對此做一個精神記錄!謝謝 –
我的問題是,如果數據庫有很多索引,你可能無法預覽整個字符串。但是你將能夠執行它 - 除非它是絕對巨大的。 –
感謝您的代碼真棒:) – MonsterMMORPG
和1件事。爲新行添加char 13:D +'。' + QUOTENAME(i.name)+';'+ char(13) – MonsterMMORPG