禁用索引时,定义仍保留在系统目录中,但不再使用。SQL Server 不维护索引(随着表中数据的变化),索引不能用来满足查询。如果禁用聚集索引,则整个表将变得不可访问。
为什么不能直接从丢弃 B 树的表中访问数据?(很可能是逐行扫描表格)这难道不是比使数据完全无法访问更合适吗?
这是一个纯粹的理论问题 - 我永远不会真正这样做。这不是一个场景,也不是一个待办事项,我只是想知道为什么事情会这样,将其视为内部问题。
禁用索引时,定义仍保留在系统目录中,但不再使用。SQL Server 不维护索引(随着表中数据的变化),索引不能用来满足查询。如果禁用聚集索引,则整个表将变得不可访问。
为什么不能直接从丢弃 B 树的表中访问数据?(很可能是逐行扫描表格)这难道不是比使数据完全无法访问更合适吗?
这是一个纯粹的理论问题 - 我永远不会真正这样做。这不是一个场景,也不是一个待办事项,我只是想知道为什么事情会这样,将其视为内部问题。
为什么不能直接从丢弃 B 树的表中访问数据?(很可能是逐行扫描表格)这难道不比无法访问的数据更合适吗?
为了回答您的问题,索引基础知识更加方便——索引由一组按 B 树结构组织的页面(索引节点)组成。这种结构本质上是分层的,根节点位于层次结构的顶部,叶节点位于底部。有关更多详细信息,请参阅此处。
此外,正如许多人所描述的那样,聚集索引 == 原始表,它们使用一个或多个键或列进行物理排序。因此,当禁用聚集索引时,无法访问其数据行。您也不能插入任何数据(对于非聚集索引,插入会成功——但这与这篇文章并不完全相关——因为这里讨论的是聚集索引),或者重组操作都不起作用。
下面将为您详细讲解:
我们将使用 Adventureworks 数据库来查看禁用CLUSTERED Index 的效果。
现在检查表中的行数:
现在禁用聚集索引
现在从表中选择行数。这次它会出错并显示以下消息:
即使重组操作也不起作用!
现在重建聚集索引,它应该可以正常工作。
选择表看看我们是否可以访问数据
所以底线是,如果我们禁用聚集索引,那么表中的数据仍然存在,但除了 Drop 或 REBUILD 操作之外的任何操作都无法访问。所有相关的非聚集索引和视图都将不可用,并且引用该表的外键将被禁用,并且通过引导所有引用该表的查询的失败。
注意:没有启用索引的选项。你必须重建它。
B+树的叶子层是表。您希望通过禁用 CI 来实现什么?如果您不希望数据无法访问,请不要这样做。
我不太确定为什么 SQL Server 甚至允许您这样做。
...还禁用了 NCI,因此即使是它所
SELECT
涵盖的查询也被禁用。我想不出任何用例。-马丁史密斯我能想到的唯一用途就是正在讨论的内容。禁用表。如果您有一个不希望任何人触摸的表,甚至是
dbo
或sysadmin
,那么您可以禁用聚集索引。该表与数据一起存在,但在您重新启用聚集索引之前完全无法访问。-肯尼斯费舍尔