为什么禁用聚集索引会使表不可访问?


11

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

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

这是一个纯粹的理论问题-我绝对不会这样做。这不是一个场景,也不是一个要做的事情,我只是想知道事情为什么这样发展,将其视为内部问题。

Answers:


10

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

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

同样,正如许多人所描述的那样,聚簇索引==原始表,这些表实际上是用一个或多个键或列排序的。因此,当禁用聚集索引时,将无法访问其数据行。您也将无法插入任何数据(对于非聚簇索引,插入将成功-但这与这篇文章并不完全相关-此处讨论的是聚簇索引),或者重新组织操作均无效。

下面将详细解释你:

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

在此处输入图片说明

现在检查表中的行数:

在此处输入图片说明

现在禁用聚簇索引

在此处输入图片说明

现在,从表中选择行数。这次它将出现以下错误:

在此处输入图片说明

甚至重组操作也不起作用!

在此处输入图片说明

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

在此处输入图片说明

选择表格以查看是否可以访问数据

在此处输入图片说明

因此,最重要的是,如果我们禁用聚簇索引,则表中的数据仍然存在,但除Drop或REBUILD操作以外的其他任何内容都无法访问。所有相关的非聚集索引和视图将不可用,并且将禁用引用该表的外键,并通过对引用该表的所有查询进行FAILURE引导。

注意:没有启用索引的选项。您必须重新构建它。


2

B +树的叶级别表格。您希望通过禁用CI来实现什么?如果您不希望数据不可访问,请不要执行此操作。

我不太确定为什么SQL Server甚至允许您执行此操作。

CREATE TABLE T
(
    X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, 
    Y INT CONSTRAINT UQ UNIQUE NONCLUSTERED
);

ALTER INDEX PK ON T DISABLE;

...也将禁用NCI,因此即使SELECT该覆盖的查询也会被禁用。我想不出任何用例。- 马丁·史密斯

我能想到的唯一用途就是正在讨论的内容。禁用表。如果您有一个不希望任何人触摸的表,甚至dbosysadmin,那么您可以禁用聚集索引。该表与数据一起存在,但在重新启用聚簇索引之前是完全不可访问的。- 肯尼斯·费舍

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.