2017-03-04 9 views
1

ユーザー定義インデックスが作成されたテーブルCateg12_ItemsがSql Server 2012にあります。これらの名前はindex1,index2,index3,index4,index5, index6,index7, index8, index9, index10です。これは単なる例であり、最後のインデックスはindex10またはindex11またはindex55またはindex100である可能性があります。つまり、index5から始まって、常に順番に名前が付けられた任意の数のインデックスが作成されます。SQL Server 2012でテーブルのユーザー定義インデックスを削除します

index1からindex4までの最初の4つのインデックスは、テーブルデータが再投入されたときに削除する必要はありませんが、index5から始まる他のすべてのインデックスは削除して再作成する必要があります。

私の問題は、index5からすべてのインデックスを削除する方法です。もちろん、以下のT-SQLのように個別のインデックスを削除することもできますが、1つのステートメントでそれを実行しようとしていました。私は見つけることができないシステム定義のストアドプロシージャがあるかもしれません。

質問:テーブル上の複数のインデックスを削除するシステム定義のストアドプロシージャはありますか?

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; | 
+---------------------------------------------------------+ 
関連する問題