2013-02-06 49 views
1

如何從一個數據庫中刪除所有索引,無論是集羣還是非集羣?刪除特定數據庫的所有索引

我需要用腳本來做,而不是通過GUI。

EDITED

數據庫有7個表,其中有些是查找,有些是過度外鍵關聯的。每個表都有一個最小的索引,在創建主鍵時創建,所以自動創建約束。當通過GUI刪除這樣的索引時,我得到一個錯誤,即由於依賴於其他鍵,索引不能被刪除。

因此,我需要先刪除外鍵的索引鍵,然後刪除通過主鍵創建的索引。

+0

你能解釋一下你爲什麼要這樣做嗎? –

+0

我有一些創建索引的示例數據庫。我想創建一些使用數據庫引擎優化顧問的練習,如果我有堆表,這將是一個很好的例子。所以,目的是讓Tuning Advisor爲我提供哪些索引來創建哪些對象。我想我解釋得很好:) – veljasije

+0

夠公平的。 :-) –

回答

13

稍有不同的變化,然而,它的第一下降外鍵,則主鍵,則索引(非聚集索引第一所以你不會轉換爲堆(可能會影響所有非聚集索引))。

USE specific_database; 
GO 

首先,刪除所有外鍵:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N''; 

SELECT @sql = @sql + N'ALTER TABLE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
    + ' DROP CONSTRAINT ' + QUOTENAME(name) + '; 
' 
FROM sys.foreign_keys 
WHERE OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0; 

EXEC sp_executesql @sql; 

現在刪除主鍵:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N''; 

SELECT @sql = @sql + N'ALTER TABLE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([parent_object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([parent_object_id])) 
    + ' DROP CONSTRAINT ' + QUOTENAME(name) + '; 
' 
FROM sys.key_constraints 
WHERE [type] = 'PK' 
AND OBJECTPROPERTY([parent_object_id], 'IsMsShipped') = 0; 

EXEC sp_executesql @sql; 

最後,索引,第一個非聚集:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N''; 

SELECT @sql = @sql + N'DROP INDEX ' 
    + QUOTENAME(name) + ' ON ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + '; 
' 
FROM sys.indexes 
WHERE index_id > 0 
AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0 
ORDER BY [object_id], index_id DESC; 

EXEC sp_executesql @sql; 

請注意,數據庫引擎優化顧問無線我會推薦一堆這些索引(並且根據您提交的工作負載,可能會遺漏一些索引,並可能提示冗餘索引和幾乎重複的索引)。但是,它不會推薦您剛剛刪除的任何數據完整性內容(PK,FK,唯一限制)。

+0

好的,這段代碼將擦除非聚簇索引。但是當創建主鍵時,會在分區中創建哪些聚類?由於密鑰依賴性,刪除時是否存在一些限制? – veljasije

+0

@veljasije是的,這是真的,我認爲這些只是聚集和非聚集索引,約束將需要額外的處理。 –

+0

我的道歉,我沒有明確提及我需要的所有東西。我會重寫我的問題。 – veljasije

5

創建動態SQL的Dynamic SQL

DECLARE @qry nvarchar(max); 
SELECT @qry = (SELECT 'DROP INDEX ' + ix.name + ' ON ' + OBJECT_NAME(ID) + '; ' 
       FROM sysindexes ix 
       WHERE ix.Name IS NOT NULL AND 
         ix.Name LIKE '%prefix_%' 
       FOR XML PATH('')); 
EXEC sp_executesql @qry 
+2

除非你知道OP使用的是SQL Server 2000,否則請使用'sys.indexes'。'sysindexes'最終會從產品中刪除... –

+2

還要注意不要使用模式前綴 - 並非所有對象都是在dbo中,並不是每個用戶的默認模式都是dbo ... –

相關問題