文件修复

如何重组和重建SQL Server数据库中的索引?

简介:当索引变得碎片化时,MS SQL Server选择不使用索引。在分片的情况下,查询性能会下降,数据并发性和锁会增加。本文介绍了碎片的概念,并讨论了管理索引碎片的两种方法——重组和重建。

Windows免费下载
Windows免费下载

在MS-SQL Server数据库中,数据存储在页面每页8 KB宽,8个连续的页组成程度上

下图显示了页面是如何链接在一起的通过b树索引结构

b - tree % 20指数% 20的结构

B-树索引结构(其中字母“B”代表平衡)是一个多层结构,具有根、中间和叶级别。在级别之间链接的页面允许索引查找操作。在Leaf级别,一个“双链表”链接页面。此链接用于扫描索引。

我们可以看到这是一个聚集索引,因为在Leaf级别有数据页。这意味着:

  • 物理数据存储在聚集索引中
  • 聚集索引定义表的逻辑顺序

另一方面,非聚类索引具有相同的b树结构,但它的数据指向聚类索引。

什么是索引碎片?

碎片是一种自然现象,被定义为没有连续数据的一种情况。这是由于在数据库中不断插入、更新和删除数据的操作。

当某些页面的逻辑顺序(在索引内,基于索引的键值)与索引页面的物理顺序不匹配时,我们可以说b树索引是碎片化的。

例如,当我们向表中添加行时,索引就会变成碎片(也称为分散的)。数据库引擎也会自动修改相关的索引。这可能会导致现有页面被拆分,为新行腾出空间。

如果在页中插入新行,但没有足够的空间,则分配一个新的数据页,甚至分配一个新的区段,同时将现有数据页中的部分数据移动到新分配的数据页。为了维护索引中的逻辑排序顺序,更新两个页面上的指针。

有两种类型的索引碎片:

  • 逻辑分割,当页面的逻辑顺序与物理顺序不匹配时。
  • 内部分裂-当索引中的数据页包含空闲空间时。
类型% 20 % 20指数% 20的碎片

从性能的角度来看,逻辑碎片导致物理读的数量增加。内部碎片导致逻辑读取增加。

更新表中的字段也会产生碎片。当我们写入更多数据时,可能会出现这样的情况:一页数据被填满,而需要另一页数据。

我们如何解决这个问题?

为了减少碎片化,我们可以执行微软开发的两个任务之一。

1.重组任务

重组任务将索引页移动到更有效的搜索顺序。要做到这一点:

  • 将索引行压缩在一起,试图释放一些索引页。
  • 在小事务中交换剩余的页面,直到所有页面都符合逻辑顺序。在流程结束时,页面的物理顺序与逻辑顺序相同。

结果将产生逻辑有序的页面,而不是物理连续的页面。这种方法非常节省空间,因为它只需要一个8 KB的页面作为将要移动的页面的临时存储区域。

当重组任务正在运行时,底层表或索引不会被锁定。但是,如果索引在逻辑上高度碎片化,那么该任务将比重新索引花费更长的时间。重组任务的一个重要方面是它在一个小型原子事务中执行。

在处理一个巨大的索引时,我们可以停止只回滚一小部分工作的任务,然后稍后恢复任务。

2.重建任务

重建任务的操作与重组任务不同。这个过程构建一个新索引并删除旧索引。这与旧索引中存在的碎片无关。这种处理方式意味着我们需要为新索引提供足够的空间。

MS SQL Server有两种不同类型的重建索引任务:在线和离线。MS SQL Server标准版只支持离线类型,企业版和开发人员版也支持在线类型。

条款在线和离线指示在重建操作期间是否可以保持索引的可访问性。

离线重建

  • 该操作移动页面,使它们在物理上连续。
  • 该操作在单个索引级别上是原子的。这意味着如果我们中断进程,索引上的所有工作都将回滚并丢失。
  • 在此过程期间,索引或表将被锁定,无法更新。

在线重建

  • 在线索引重建的工作原理与离线过程完全相同。
  • 主要的区别是在线重建锁定底层索引或表。

碎片整理的策略

让我们讨论如何获得碎片程度,以及如何使用SQL Server Management Studio (SSMS)或Transact-SQL重组或重建碎片索引。

程度的碎片

我们不能在知道程度的碎片.我们可以通过使用DMF获得这些信息sys.dm_db_index_physical_stats

通过下面的语句,我们可以得到每个表的每个索引的碎片百分比:

微软在线% 20本书% 20
微软在线% 20本书% 20

在得到碎片百分比后,我们可以选择最佳的方法对索引进行碎片整理。

微软在线图书提供了以下价值:

  • 如果碎片小于5%,则不需要碎片整理。
  • 如果碎片化的比例在5%到30%之间,我们就应该这么做重组索引。
  • 如果碎片化大于30%,我们应该重建索引。

使用T-SQL命令进行碎片整理

假设,我们有一个带有索引的OrdTes表IDX_OrdTes_DateDoc。

整理% 20使用% 20 t - sql % 20命令

我们可以使用第一种T-SQL语法重新组织索引,并使用第二种语法重新构建索引(参见下图)。

整理% 20使用% 20 t - sql命令% % 20 201

可以使用以下语法重新组织或重建表的所有索引。

整理% 20使用% 20 t - sql命令% 20 - % % 20 202 20%

使用SQL Server Management Studio (SSMS)整理

下面是使用SSMS重新组织索引的步骤:

  • 在对象资源管理器中,展开包含要在其上重新组织索引的表的数据库。
  • 展开Tables文件夹。
  • 展开要在其上重新组织索引的表。
  • 右键单击Indexes文件夹并选择Reorganize All。
  • 在“重新组织索引”对话框中,验证要重新组织的索引中是否有正确的索引。要从要重组的索引网格中删除索引,请选择该索引,然后按Delete键。
  • 选择“压缩大对象列数据”复选框以指定包含大对象(LOB)数据的所有页面也进行压缩。
  • 单击OK。
整理% 20使用% 20 sql % 20服务器% 20管理% 20工作室% 20 (ssm)

下面是重建索引的步骤:

  • 在对象资源管理器中,展开包含要在其上重建索引的表的数据库。
  • 展开Tables文件夹。
  • 展开要在其上重建索引的表。
  • 展开Indexes文件夹。
  • 右键单击索引并选择Rebuild。
  • 在“重建索引”对话框中,验证要重建的索引网格中的索引是否正确,然后单击“确定”。
  • 选择“压缩大对象列数据”复选框以指定包含大对象(LOB)数据的所有页面也进行压缩。
  • 单击OK。
重建

维护计划中的碎片整理索引

如前所述,必须始终有一个碎片整理策略。有必要制定一个定期执行该活动的维护计划。维护计划不仅将对索引进行碎片整理,还将执行其他重要操作,如统计维护和数据库备份。

要创建新的维护计划,请从“管理”菜单中右键单击维护项目。然后,选择“新维护计划”项。

新建% 20 % 20 maintennance % 20计划

在维护计划中,我们可以添加各种任务。

若要执行“重组索引”任务,请将“重组索引”任务拖放到屏幕中央。要执行重建索引任务,请将重建索引任务拖放到屏幕中央。

重建% 20重组% 20指数% 20的任务

一旦我们添加了一个或两个任务,我们应该设置它们。

设置Reorganize任务:

  • 指定在哪些数据库上执行该操作。
  • 选择只重新组织必要的数据库、只重新组织用户数据库或只重新组织系统数据库。
  • 只在某些条件下选择重新组织索引,例如超过一定百分比的碎片或超过一定数量的页面。
重组% 20指数% 20的任务

设置Rebuild任务:

  • 指定在哪些数据库上执行该操作。
  • 选择只重新组织必要的数据库、只重新组织用户数据库或只重新组织系统数据库。
  • 选择仅在某些条件下重新构建索引,例如超过一定百分比的碎片或超过一定数量的页面。
重建% 20指数% 20的任务

在配置结束时,保存维护计划并将其安排为以某个频率运行。

结论

在碎片整理过程中,数据库可能会损坏并返回错误。如果手动错误恢复方法不起作用,我建议您尝试一下恒星修复MS SQL软件这个易于使用的软件允许通过解析SQL数据库的每个表和每个对象来完全恢复损坏的数据库。

进步
79% 许多人认为这篇文章有帮助