Answers:
为什么不能直接从丢弃B树的表中访问数据?(最有可能通过逐行扫描表)比根本无法访问的数据更合适吗?
为了回答您的问题,建立索引基础更加方便-索引由以B树结构组织的一组页面(索引节点)组成。这种结构本质上是分层的,根节点在分层结构的顶部,叶节点在底部。有关更多详细信息,请参见此处。
同样,正如许多人所描述的那样,聚簇索引==原始表,这些表实际上是用一个或多个键或列排序的。因此,当禁用聚集索引时,将无法访问其数据行。您也将无法插入任何数据(对于非聚簇索引,插入将成功-但这与这篇文章并不完全相关-此处讨论的是聚簇索引),或者重新组织操作均无效。
下面将详细解释你:
我们将使用Adventureworks数据库查看禁用CLUSTERED Index 的效果。
现在检查表中的行数:
现在禁用聚簇索引
现在,从表中选择行数。这次它将出现以下错误:
甚至重组操作也不起作用!
现在重建聚簇索引,它应该可以正常工作。
选择表格以查看是否可以访问数据
因此,最重要的是,如果我们禁用聚簇索引,则表中的数据仍然存在,但除Drop或REBUILD操作以外的其他任何内容都无法访问。所有相关的非聚集索引和视图将不可用,并且将禁用引用该表的外键,并通过对引用该表的所有查询进行FAILURE引导。
注意:没有启用索引的选项。您必须重新构建它。
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
该覆盖的查询也会被禁用。我想不出任何用例。- 马丁·史密斯
我能想到的唯一用途就是正在讨论的内容。禁用表。如果您有一个不希望任何人触摸的表,甚至dbo
或sysadmin
,那么您可以禁用聚集索引。该表与数据一起存在,但在重新启用聚簇索引之前是完全不可访问的。- 肯尼斯·费舍