在MS-SQL Server数据库中,数据存储在页面每页8 KB宽,8个连续的页组成程度上.
下图显示了页面是如何链接在一起的通过b树索引结构.
B-树索引结构(其中字母“B”代表平衡)是一个多层结构,具有根、中间和叶级别。在级别之间链接的页面允许索引查找操作。在Leaf级别,一个“双链表”链接页面。此链接用于扫描索引。
我们可以看到这是一个聚集索引,因为在Leaf级别有数据页。这意味着:
- 物理数据存储在聚集索引中
- 聚集索引定义表的逻辑顺序
另一方面,非聚类索引具有相同的b树结构,但它的数据指向聚类索引。
什么是索引碎片?
碎片是一种自然现象,被定义为没有连续数据的一种情况。这是由于在数据库中不断插入、更新和删除数据的操作。
当某些页面的逻辑顺序(在索引内,基于索引的键值)与索引页面的物理顺序不匹配时,我们可以说b树索引是碎片化的。
例如,当我们向表中添加行时,索引就会变成碎片(也称为分散的)。数据库引擎也会自动修改相关的索引。这可能会导致现有页面被拆分,为新行腾出空间。
如果在页中插入新行,但没有足够的空间,则分配一个新的数据页,甚至分配一个新的区段,同时将现有数据页中的部分数据移动到新分配的数据页。为了维护索引中的逻辑排序顺序,更新两个页面上的指针。
有两种类型的索引碎片:
- 逻辑分割,当页面的逻辑顺序与物理顺序不匹配时。
- 内部分裂-当索引中的数据页包含空闲空间时。
从性能的角度来看,逻辑碎片导致物理读的数量增加。内部碎片导致逻辑读取增加。
更新表中的字段也会产生碎片。当我们写入更多数据时,可能会出现这样的情况:一页数据被填满,而需要另一页数据。
我们如何解决这个问题?
为了减少碎片化,我们可以执行微软开发的两个任务之一。
1.重组任务
重组任务将索引页移动到更有效的搜索顺序。要做到这一点:
- 将索引行压缩在一起,试图释放一些索引页。
- 在小事务中交换剩余的页面,直到所有页面都符合逻辑顺序。在流程结束时,页面的物理顺序与逻辑顺序相同。
结果将产生逻辑有序的页面,而不是物理连续的页面。这种方法非常节省空间,因为它只需要一个8 KB的页面作为将要移动的页面的临时存储区域。
当重组任务正在运行时,底层表或索引不会被锁定。但是,如果索引在逻辑上高度碎片化,那么该任务将比重新索引花费更长的时间。重组任务的一个重要方面是它在一个小型原子事务中执行。
在处理一个巨大的索引时,我们可以停止只回滚一小部分工作的任务,然后稍后恢复任务。
2.重建任务
重建任务的操作与重组任务不同。这个过程构建一个新索引并删除旧索引。这与旧索引中存在的碎片无关。这种处理方式意味着我们需要为新索引提供足够的空间。
MS SQL Server有两种不同类型的重建索引任务:在线和离线。MS SQL Server标准版只支持离线类型,企业版和开发人员版也支持在线类型。
条款在线和离线指示在重建操作期间是否可以保持索引的可访问性。
离线重建
- 该操作移动页面,使它们在物理上连续。
- 该操作在单个索引级别上是原子的。这意味着如果我们中断进程,索引上的所有工作都将回滚并丢失。
- 在此过程期间,索引或表将被锁定,无法更新。
在线重建
- 在线索引重建的工作原理与离线过程完全相同。
- 主要的区别是在线重建锁定底层索引或表。
碎片整理的策略
让我们讨论如何获得碎片程度,以及如何使用SQL Server Management Studio (SSMS)或Transact-SQL重组或重建碎片索引。
程度的碎片
我们不能在知道程度的碎片.我们可以通过使用DMF获得这些信息sys.dm_db_index_physical_stats.
通过下面的语句,我们可以得到每个表的每个索引的碎片百分比:
在得到碎片百分比后,我们可以选择最佳的方法对索引进行碎片整理。
微软在线图书提供了以下价值:
- 如果碎片小于5%,则不需要碎片整理。
- 如果碎片化的比例在5%到30%之间,我们就应该这么做重组索引。
- 如果碎片化大于30%,我们应该重建索引。
使用T-SQL命令进行碎片整理
假设,我们有一个带有索引的OrdTes表IDX_OrdTes_DateDoc。
我们可以使用第一种T-SQL语法重新组织索引,并使用第二种语法重新构建索引(参见下图)。
可以使用以下语法重新组织或重建表的所有索引。
使用SQL Server Management Studio (SSMS)整理
下面是使用SSMS重新组织索引的步骤:
- 在对象资源管理器中,展开包含要在其上重新组织索引的表的数据库。
- 展开Tables文件夹。
- 展开要在其上重新组织索引的表。
- 右键单击Indexes文件夹并选择Reorganize All。
- 在“重新组织索引”对话框中,验证要重新组织的索引中是否有正确的索引。要从要重组的索引网格中删除索引,请选择该索引,然后按Delete键。
- 选择“压缩大对象列数据”复选框以指定包含大对象(LOB)数据的所有页面也进行压缩。
- 单击OK。
下面是重建索引的步骤:
- 在对象资源管理器中,展开包含要在其上重建索引的表的数据库。
- 展开Tables文件夹。
- 展开要在其上重建索引的表。
- 展开Indexes文件夹。
- 右键单击索引并选择Rebuild。
- 在“重建索引”对话框中,验证要重建的索引网格中的索引是否正确,然后单击“确定”。
- 选择“压缩大对象列数据”复选框以指定包含大对象(LOB)数据的所有页面也进行压缩。
- 单击OK。
维护计划中的碎片整理索引
如前所述,必须始终有一个碎片整理策略。有必要制定一个定期执行该活动的维护计划。维护计划不仅将对索引进行碎片整理,还将执行其他重要操作,如统计维护和数据库备份。
要创建新的维护计划,请从“管理”菜单中右键单击维护项目。然后,选择“新维护计划”项。
在维护计划中,我们可以添加各种任务。
若要执行“重组索引”任务,请将“重组索引”任务拖放到屏幕中央。要执行重建索引任务,请将重建索引任务拖放到屏幕中央。
一旦我们添加了一个或两个任务,我们应该设置它们。
设置Reorganize任务:
- 指定在哪些数据库上执行该操作。
- 选择只重新组织必要的数据库、只重新组织用户数据库或只重新组织系统数据库。
- 只在某些条件下选择重新组织索引,例如超过一定百分比的碎片或超过一定数量的页面。
设置Rebuild任务:
- 指定在哪些数据库上执行该操作。
- 选择只重新组织必要的数据库、只重新组织用户数据库或只重新组织系统数据库。
- 选择仅在某些条件下重新构建索引,例如超过一定百分比的碎片或超过一定数量的页面。
在配置结束时,保存维护计划并将其安排为以某个频率运行。
结论
在碎片整理过程中,数据库可能会损坏并返回错误。如果手动错误恢复方法不起作用,我建议您尝试一下恒星修复MS SQL软件这个易于使用的软件允许通过解析SQL数据库的每个表和每个对象来完全恢复损坏的数据库。