为什么禁用聚集索引会使表无法访问?

Taw*_*feh 11 sql-server clustered-index database-internals

当索引被禁用时,定义保留在系统目录中但不再使用。SQL Server 不维护索引(因为表中的数据发生变化),并且索引不能用于满足查询。如果禁用聚集索引,则整个表将无法访问。

为什么不能直接从丢弃 B 树的表中访问数据?(最有可能通过逐行扫描表格)这比使数据完全无法访问更合适吗?

这是一个纯粹的理论问题 - 我永远不会真正这样做。这不是一个场景,也不是一个待办事项,我只是想知道为什么事情会这样,将其视为一个内部问题。

Kin*_*hah 10

为什么不能直接从丢弃 B 树的表中访问数据?(最有可能通过逐行扫描表格)这根本不会比无法访问的数据更合适吗?

为了回答您的问题,索引基础知识更方便——索引由一组以 B 树结构组织的页面(索引节点)组成。这种结构本质上是分层的,根节点在层次结构的顶部,叶节点在底部。有关更多详细信息,请参阅此处

此外,正如许多人所描述的那样,聚集索引 == 原始表,它们按一个或多个键或列进行物理排序。因此,当禁用聚集索引时,无法访问其数据行。您将无法插入任何数据(对于非聚集索引,插入会成功——但这与这篇文章并不完全相关——因为这里讨论的是聚集索引),或者重组操作都不起作用。

下面将为您详细讲解:

我们将使用 Adventureworks 数据库来查看禁用CLUSTERED索引的效果。

在此处输入图片说明

现在检查表中的行数:

在此处输入图片说明

现在禁用聚集索引

在此处输入图片说明

现在从表中选择行数。这次它会出错并显示以下消息:

在此处输入图片说明

即使重组操作也不起作用!!

在此处输入图片说明

现在重建聚集索引,它应该可以正常工作。

在此处输入图片说明

选择表格,看看我们是否可以访问数据

在此处输入图片说明

所以底线是,如果我们禁用聚集索引,那么表中的数据仍然存在,但除了 Drop 或 REBUILD 操作之外的任何其他操作都无法访问。所有相关的非聚集索引和视图将不可用,并且引用该表的外键将被禁用,并导致引用该表的所有查询的 FAILURE。

注意:没有选项可以启用索引。你必须重建它。