修改现有索引:使用drop_existing = on和alter index statement创建索引

时间:2017-01-13 16:46:51

标签: sql-server tsql

我是索引维护新手。我看到我们的大多数索引都使用create indexdrop_existing = on进行了修改。例如:

create nonclustered index ixn_SomeTable__SomeIndexName_ic1 
on dbo.SomeTable                ( Column1 )
include                         ( Column2, IncludeThisNewColumn3 )
with ( sort_in_tempdb = on, drop_existing = on, online = on, fillfactor = 95 ) on [SomeFileGroup]
go

但我看到TSQL也有alter index声明。

问题 -

  1. drop_existing=on做什么?如果索引存在并且重新创建它,它是否只是丢弃索引,或者如果修改不真正需要重建索引,那么它是否可以节省重建索引(重新索引数据等)。 (例如,包括非聚集索引中的列)?
  2. create index with drop_existing = onalter index之间有什么区别?我什么时候必须使用其中一种?
  3. 当索引的修改正在进行时,索引是否变得不可用,是否有办法将不可用时间保持在最低限度?

1 个答案:

答案 0 :(得分:2)

  

drop_existing = on做什么?它是否只是删除了索引(如果存在)并重新创建它,或者它是否在重建索引时保存(重新索引数据等)

DROP_EXISTING子句告诉SQL Server现有的聚簇索引被删除但是会在其位置添加一个新的聚合索引,让SQL Server推迟更新非聚簇索引,直到新的聚簇索引到位为止< / p>

  如果修改不是真的需要重建索引,那么它是否可以节省重建索引(重新索引数据等)。 (例如,包括非聚集索引中的列)?

如果聚集索引键没有改变并且定义为UNIQUE

,SQL Server根本不会重建非聚簇索引
  

create index with drop_existing = on和alter index有什么区别?我什么时候必须使用其中一种?

alter index用于Rebuild / Reorg index ..我没有看到与Create的任何比较

  

当索引的修改正在进行时,索引是否变得不可用,是否有办法将不可用时间保持在最低限度?

当你使用DROP EXISTING子句时,索引将在大多数时间可用.Index将在末尾需要一个独占锁,但这个阻塞将非常短

<强>参考文献:
https://stackoverflow.com/a/41096665/2975396
https://msdn.microsoft.com/en-us/library/ms188783.aspx
http://sqlmag.com/database-high-availability/use-create-indexs-dropexisting-clause-when-recreating-clustered-index