2011-09-23 97 views
4

我打算刪除除主鍵以外的所有索引。我自己創建了主鍵,但所有其他索引都是SQL Server的建議。如何刪除主鍵除單鍵查詢外的所有索引

刪除所有不是主鍵的索引後,計劃爲數據庫調整顧問程序使用SQL Server分析器調整模板並創建索引。

用這種方法計劃沒有未使用的索引或性能下降索引。

這是多合乎邏輯? 謝謝。

回答

11
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; 
+0

感謝您的代碼真棒:) – MonsterMMORPG

+0

和1件事。爲新行添加char 13:D +'。' + QUOTENAME(i.name)+';'+ char(13) – MonsterMMORPG

4

最簡單的方法可能是這樣的:運行這個查詢將輸出一個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語句,檢查他們,也許調整它們,然後運行它們實際下降指數。

+0

只是關於相信所有系統對象都在sys架構中的評論......如果您意外地在MSDB或master中運行此代碼,您將返回不在sys架構中的系統對象的行。只要記住一點 - 您可以通過使用'OBJECTPROPERTY(object_id,'IsMsShipped')= 0'來輕鬆解決這個問題。 –

+0

@AaronBertrand:謝謝 - 您的解決方案的效果肯定比我的解決方案更好 - 我將不得不對此做一個精神記錄!謝謝 –

+1

我的問題是,如果數據庫有很多索引,你可能無法預覽整個字符串。但是你將能夠執行它 - 除非它是絕對巨大的。 –