Indexing 删除SQL Server 2012中表的用户定义索引
我在Sql Server 2012中有一个表Indexing 删除SQL Server 2012中表的用户定义索引,indexing,sql-server-2012,Indexing,Sql Server 2012,我在Sql Server 2012中有一个表Categ12\u Items,它创建了用户定义的索引。它们被命名为index1、index2、index3、index4、index5、index6、index7、index8、index9、index10。这只是一个示例,最后一个索引可以是index10或index11或index55或index100,这意味着从index5开始,可以创建任意数量的索引,这些索引将始终按顺序命名 重新填充表数据时,不必删除从index1到index4的前4个索引,
Categ12\u Items
,它创建了用户定义的索引。它们被命名为index1、index2、index3、index4、index5、index6、index7、index8、index9、index10
。这只是一个示例,最后一个索引可以是index10或index11或index55或index100,这意味着从index5开始,可以创建任意数量的索引,这些索引将始终按顺序命名
重新填充表数据时,不必删除从index1到index4的前4个索引,但需要删除并重新创建从index5开始的所有其他索引
我的问题是如何删除从index5开始的所有索引。当然,我可以像下面的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;
参考:
您可以禁用索引,并在完成所需操作后重建它们
禁用索引:
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;
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;
然后做你的事:
/* do stuff */
--select 'doing some stuff' as done;
/* done with doing stuff*/
然后重建索引:
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;
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演示:
以下是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; |
+---------------------------------------------------------+