2017-03-04 53 views
1

我在Sql Server 2012中有一個表Categ12_Items,它具有創建的用戶定義索引。這些被命名爲index1,index2,index3,index4,index5, index6,index7, index8, index9, index10。這僅僅是一個例子,最後一個索引可以是index10或index11或index55或index100,這意味着從索引5開始可以創建任意數量的索引,這些索引將始終按順序命名。刪除SQL Server 2012中的表的用戶定義索引

重新填充表數據時,不必刪除從索引1到索引4的前4個索引,但需要刪除並重新創建從索引5開始的所有其他索引。

我的問題是如何刪除從索引5開始的所有索引。當然,我可以像下面的T-SQL一樣使用drop個別索引,但我試圖用一個語句來完成。可能是系統定義的存儲過程,我無法找到。

問題:是否有系統定義的存儲過程將刪除表上的多個索引?

DROP INDEX index5 on Categ12_Items; 
DROP INDEX index6 on Categ12_Items; 
DROP INDEX index7 on Categ12_Items; 
DROP INDEX index8 on Categ12_Items; 
DROP INDEX index9 on Categ12_Items; 
DROP INDEX index10 on Categ12_Items; 

回答

1

參考:Disabling vs. Dropping Indexes - Brent Ozar

您可以禁用索引,重建他們你完成後做你需要做什麼。

禁用索引:

declare @tablename sysname = 'dbo.Categ12_Items'; 
declare @indexes nvarchar(max); 

set @indexes = stuff((
    select 
     char(10)+'alter index '+quotename(i.name)+' on ' 
     +quotename(schema_name(o.schema_id)) 
     +'.' +quotename(object_name(i.object_id)) 
     +' disable;' 
    from sys.indexes as i 
    inner join sys.objects o 
     on i.object_id = o.object_id 
    where o.is_ms_shipped=0 
    and i.object_id = object_id(@tablename) 
    and i.name not in ('index_1','index_2','index_3','index_4') 
    order by i.name 
    for xml path (''), type).value('.','varchar(max)') 
    ,1,1,''); 

--select @indexes as disabling_indexes; 
exec sp_executesql @indexes; 

然後做你的事:

/* do stuff */ 
--select 'doing some stuff' as done; 
/* done with doing stuff*/ 

然後重建索引:

set @indexes = stuff((
    select 
     char(10)+'alter index '+quotename(i.name)+' on ' 
     +quotename(schema_name(o.schema_id)) 
     +'.'+quotename(object_name(i.object_id)) 
     +' rebuild;' 
    from sys.indexes as i 
    inner join sys.objects o 
     on i.object_id = o.object_id 
    where o.is_ms_shipped=0 
    and i.object_id = object_id(@tablename) 
    and i.name not in ('index_1','index_2','index_3','index_4') 
    order by i.name 
    for xml path (''), type).value('.','varchar(max)') 
    ,1,1,''); 

--select @indexes as rebuilding_indexes; 
exec sp_executesql @indexes; 

rextester演示:http://rextester.com/RXQYM31744

她e是rextester演示的輸出是:

+---------------------------------------------------------+ 
|     disabling_indexes     | 
+---------------------------------------------------------+ 
| alter index [index_5] on [dbo].[Categ12_Items] disable; | 
| alter index [index_6] on [dbo].[Categ12_Items] disable; | 
| alter index [index_7] on [dbo].[Categ12_Items] disable; | 
+---------------------------------------------------------+ 

+------------------+ 
|  done  | 
+------------------+ 
| doing some stuff | 
+------------------+ 

+---------------------------------------------------------+ 
|     rebuilding_indexes     | 
+---------------------------------------------------------+ 
| alter index [index_5] on [dbo].[Categ12_Items] rebuild; | 
| alter index [index_6] on [dbo].[Categ12_Items] rebuild; | 
| alter index [index_7] on [dbo].[Categ12_Items] rebuild; | 
+---------------------------------------------------------+