Sql-Server

為什麼禁用聚集索引會使表無法訪問?

  • June 21, 2019

禁用索引時,定義仍保留在系統目錄中,但不再使用。SQL Server 不維護索引(隨著表中數據的變化),索引不能用來滿足查詢。如果禁用聚集索引,則整個表將變得不可訪問。

為什麼不能直接從丟棄 B 樹的表中訪問數據?(很可能是逐行掃描表格)這難道不是比使數據完全無法訪問更合適嗎?

這是一個純粹的理論問題 - 我永遠不會真正這樣做。這不是一個場景,也不是一個待辦事項,我只是想知道為什麼事情會這樣,將其視為內部問題。

為什麼不能直接從丟棄 B 樹的表中訪問數據?(很可能是逐行掃描表格)這難道不比無法訪問的數據更合適嗎?

為了回答您的問題,索引基礎知識更加方便——索引由一組按 B 樹結構組織的頁面(索引節點)組成。這種結構本質上是分層的,根節點位於層次結構的頂部,葉節點位於底部。有關更多詳細資訊,請參閱此處

此外,正如許多人所描述的那樣,聚集索引 == 原始表,它們使用一個或多個鍵或列進行物理排序。因此,當禁用聚集索引時,無法訪問其數據行。您也不能插入任何數據(對於非聚集索引,插入會成功——但這與這篇文章並不完全相關——因為這裡討論的是聚集索引),或者重組操作都不起作用。

下面將為您詳細講解:

我們將使用 Adventureworks 數據庫來查看禁用CLUSTERED Index 的效果。

在此處輸入圖像描述

現在檢查表中的行數:

在此處輸入圖像描述

現在禁用聚集索引

在此處輸入圖像描述

現在從表中選擇行數。這次它會出錯並顯示以下消息:

在此處輸入圖像描述

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

在此處輸入圖像描述

現在重建聚集索引,它應該可以正常工作。

在此處輸入圖像描述

選擇表看看我們是否可以訪問數據

在此處輸入圖像描述

所以底線是,如果我們禁用聚集索引,那麼表中的數據仍然存在,但除了 Drop 或 REBUILD 操作之外的任何操作都無法訪問。所有相關的非聚集索引和視圖都將不可用,並且引用該表的外鍵將被禁用,並且通過引導所有引用該表的查詢的失敗。

注意:沒有啟用索引的選項。你必須重建它。

引用自:https://dba.stackexchange.com/questions/41519