2014-10-26 109 views
1

我知道當我們用SQL Server主鍵創建一個表時,會自動創建一個聚集索引。但是,如果我從這個表中刪除一行,與此行相關的聚集索引是否仍然保留在索引表中,或者它會自動刪除?如果它沒有被自動刪除,我是否必須創建一個作業來重建和重新組織索引? (是限於MySQL,Oracle等一樣嗎?)SQL Server中的羣集索引

+0

當然,聚集索引(像任何其他索引)不斷更新。這就是爲什麼太多索引可能比沒有索引更糟!有一個索引**總是**也承擔着維護它的重任! – 2014-10-26 18:03:58

回答

1

Oracle或MySQL的默認值不相同。每個數據庫都有其自己的默認值及其特定功能。有些甚至對不同的含義使用相同的術語。

Oracle不默認爲聚集索引,而在Oracle中,等效索引組織表爲。在Oracle中,CLUSTER的定義是一個可以存儲2個或更多表並將它們排序相同的結構。

如果不是自動刪除,我是否必須創建一個作業到 重建和重新組織索引?

重建索引#1規則 - 衡量,測量,衡量。證明重建是有益的,否則除非事情發生變化,否則不要費心去做。

簡單刪除(或千)不是重建索引的自動原因。

如果您即將重建索引,您應該知道(1)前後訪問時間前後的數據塊數量(2)。

作爲一般的做法,索引重建有許多錯誤信息和迷信。您所指的索引是B-Tree結構。這些設計是可擴展的,O(日誌N)訪問。沒有證據表明索引必須在默認情況下重新組織。每個指標都是它自己的動物。 B樹指標在一段時間後達到停滯點(平衡),當你重建它們時,它們會壓縮它們(一件好事),但它們最終會回到停滯點。除非我在其中一個人身上發現性能/ IO問題,否則我會根據具體情況手動進行。

重建的兩個最大的優點:

  1. 更密集組合數據到更少的塊,從而提高了緩存和IO。
  2. 通過累積的實際數據對非聚簇索引進行重新排序。如果你的訪問模式總是連續的(包括插入),那麼這通常不是問題,塊將被排序。

Oracle和SQL Server是很棒的技術。沒有證據的情況下重建索引對於專業DBA來說並不合適。

+1

爲了清楚起見,重建的意圖總是爲1.更加密集地將數據打包到更少的塊中,這樣可以改善緩存和IO.'您可能會爲插入等提供空間,這取決於您如何選擇聚簇索引該頁面拆分不是一個問題。這實際上與所描述的相反。我不是挑選,只是指出我實際遇到的用例。 – 2014-11-01 20:48:08

2

我知道,當我們創建一個SQLSERVER表的主鍵,將自動創建一個 聚集索引。

這隻有當它是默認選項或者將clustered指定爲關鍵字時纔是如此。主鍵也可以是非聚簇索引。

但是,如果我從該表中刪除一行,並與該行的索引表中仍然保留的聚集索引 或者 自動刪除?

如果它確實是一個聚集索引,那麼索引是表數據。如果你從表格中刪除了一些東西,它就消失了。有一些內部工作,例如幽靈記錄,但是數據不見了(從應用程序的角度來看)。

如果不是自動刪除,我是否必須創建一個作業到 重建和重新組織索引?

也就是說,還有其他背景任務可以處理某些「隱藏」功能。最終,當碎片(內部或外部)開始成爲問題時,您會希望重新組織或重建索引。這將取決於其他因素,包括表結構,接入等

(是限於MySQL,Oracle等一樣嗎?)

問題被標記的SQL Server,所以我回答SQL Server標記。這對於單個帖子來說是一個非常廣泛的問題。

相關問題