SQLServer中重建聚集索引之后会影响到非聚集索引的索引碎片吗

  • 时间:
  • 浏览:0

强调其他,

对于非聚集表,alter table xxx rebuild会重建所有的非聚集索引

对于聚集表,alter table xxx rebuild只会重建聚集索引,否则可以 重建非聚集索引

  https://www.red-gate.com/simple-talk/sql/database-administration/sql-server-heaps-and-their-fragmentation/

  https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-29300-fixing-heap-fragmentation/

本文出处:http://www.cnblogs.com/wy123/p/763000215.html 

(保留出处好的反义词哪些地方原创作品权利,自己拙作还远远达能够,仅仅是为了链接到原文,否则后续对否则地处的其他错误进行修正或补充,无他)

这里姑且不管聚集索引否有聚集索引的碎片程度,这里重点关注“重建聚集索引已经 否有会对非聚集索引碎片请况产生影响”

这里重建聚集索引已经 ,重新观察索引碎片请况,看截图sys.dm_db_index_physical_stats的查询结果

还可以很清楚地发现,重建聚集索引已经 ,聚集索引四种 的碎片地处了很大的变化,碎片基本详细消除(avg_fragmentation_in_percent0.0116986429574169),

否则非聚集索引的碎片请况并没有地处任何其他变化。

If you think you can use ALTER TABLE … REBUILD to fix heap fragmentation, you can, but it causes all the nonclustered indexes to be rebuilt as the heap record locations obviously change.

测试,测试表TestFragment中,Id1字段类型为uniqueidentifier,建立聚集索引,

利用uniqueidentifier的随机性,大批量写入数据已经 其碎片变得很大

相反,Id2字段类型INT,以递增的值写入数据,大批量写入数据已经 其索引碎片会很小

否则重现Id1上的索引,观察Id2上的索引碎片会可以 否则Id1上的索引重建而地处变化

堆表的碎片消除

写入3000W数据已经 观察有一一三个 多索引上的碎片,

对于聚集索引(Id1上的索引IDX_Id1):

很明显,聚集索引(否则是uniqueidentifier类型的字段),

其avg_fragmentation_in_percent很高(99.2557236469541),并肩avg_page_space_used_in_percent较低(68.9408574252533)

对于非聚集索引(Id1上的索引IDX_Id2):

Id2索引否则是递增的,其avg_fragmentation_in_percent很低(0.5283006965174129),也全都我说碎片程度很低

首先,好的反义词先不扯聚集表堆表啥的了,直接说聚集表,

非聚集索引在叶级直接存储的是聚集索引的key值,在重建聚集索引(否则重组)前后,非聚集索引存储的对应的key值是不变的

重建聚集索引已经 ,数据的屋里存储位置否则会地处变化,这是会影响到聚集索引的物理存储和碎片请况

否则对于非聚集索引来说,非聚集索引存储的对应的聚集索引的key值是不变的,

那非聚集索引的碎片跟聚集索引的重建与否有个毛的关系。

正如我手机里记录了某自己的电话号码,我只要拨通四种 电话就能找到他,我管他是去北京上班还是去南京出差了,跟他在人具体哪里(重建聚集索引,物理位置变化)有毛关系。



从理论上全都我难理解:

聚集索引和非聚集索引是有一一三个 多详细独立的物理存储底部形态(当然也还可以说是逻辑存储底部形态)

其唯一的联系全都我非聚集索引B树叶子节点会存储聚集索引的Key值

其存储的聚集索引的key值需要其物理位置,聚集索引否则说数据四种 的位置变化好的反义词会否则key值的变化

否则说重建还是重组聚集索引可以 影响到非聚集索引的碎片请况

通过alter table xxx rebuild对堆表重建,发现非聚集索引也会否则堆表的重建而地处索引重建。

原文:

首先抛出结论:对于聚集索引表,重建聚集索引已经 可以 影响到非聚集索引的索引碎片,重建聚集索引跟非聚集索引碎片之间的没有关系,详细不搭嘎的。

哪些地方地方大大问题 ,实在尝试自己测试一下不就清楚了么?

对于堆表的索引碎片消除,也是还可以通过alter table xxx rebuild重建的,

当然需要四种 很挫的做法就你会提了(fix heap fragmentation by creating and dropping a clustered index.)

记住这是四种 很挫的做法,否则是SQL Server 30008已经 的版本中,alter table xxx rebuild语法被支持已经 的无奈之举,

这里暂不表述四种 做法。

对于堆表,alter table xxx rebuild还可以通过重建表来消除碎片,但其功能不限于次,都会重建堆表上的非聚集索引

哪些地方地方大大问题 否则不选用 语句,测试一下就出来结果了啊,我实在没有任何大大问题 的。

上午(20171011)看后qq群里发了有一一三个 多云栖大会的链接,点进去看后一下sqlserver的专场,刚好是提问环节

大家问了有一一三个 多大大问题 ,原话记不清楚了,

合适 的意思(他自己认为)全都我说:“SQLServer中重建聚集索引已经 会影响非聚集索引的碎片请况,也要顺带重建非聚集索引”

我你会合适 是他自己认为“重建聚集索引已经 会影响到非聚集索引的索引碎片”

提问者跟专家交流四种 观点,一始于提问已经 还撤了几句堆表RID,聚集表key值啥的。

专家一始于说这两者没有关系(重建聚集索引然能不可以 影响到非聚集索引的索引碎片),上面被提问已经 否则是有点儿紧张,改口说没注意过四种 大大问题 。

说实话,提问者所说的“重建聚集索引已经 会影响到非聚集索引碎片”四种 观点我也是第一次听说,

否则真的了解索引语句,应该知道这两者(重建聚集索引否有聚集索引碎片)之间没有必然的关系,

对于莫名其妙的结论,到底是道听途说还是真有其事,为哪些地方不自己动手试一试?

参考:

测试示例

聚集索引重建已经 ,对非聚集索引否有有影响

暂时不清楚alter table xxx rebuild的具体实现过程,否则从各种表现来看,他在重建表的过程中实在也重建了非聚集索引。

否则“重建表的过程中实在也重建了非聚集索引”还可以认为是“使得非聚集索引变得更加好,而需要变坏”,

这里要说明的是alter table xxx rebuild重建堆表可以 对对表上的非聚集索引产生副作用