2011-06-10 130 views
39

重建索引時,可以選擇ONLINE = OFF和ONLINE = ON。我知道當ONLINE模式打開時,它會創建索引的副本,切換新查詢以使用它,然後重建原始索引,使用版本跟蹤更改(如果我錯了,請糾正我)。SQL Server中的OFFLINE和ONLINE索引重建有什麼區別?

但SQL在離線模式下會做什麼?

+2

爲了記錄,您還可以在添加新索引時使用ONLINE = ON選項,而不僅僅是在重建它們時。 – datagod 2012-10-03 01:29:54

回答

53

在聯機模式下,建立新索引,而舊索引可讀取和寫入。舊索引上的任何更新也將應用於新索引。反物質列用於追蹤更新與重建之間可能存在的衝突(即刪除尚未複製的行)。請參閱Online Index Operations。當進程完成時,表被鎖定一段時間,新的索引替換舊的索引。如果索引包含LOB列,則SQL Server 2005/2008/R2不支持ONLINE操作。

在OFFLINE模式下,對於任何讀取或寫入操作都預先鎖定表,然後在保留表鎖的同時,從舊索引構建新索引。重建索引時,在表格上不允許讀取或寫入操作。只有當操作完成時,表格上的鎖纔會釋放,並且讀寫操作再次被允許。

請注意,在SQL Server 2012中,對LOB的限制已取消,請參見Online Index Operations for indexes containing LOB columns

+1

「如果索引包含LOB列,則SQL Server 2005/2008/R2不支持ONLINE操作。」問題:REBUILD操作會失敗,還是會降級爲離線重建? – esac 2011-06-10 20:05:32

+1

將失敗,並顯示錯誤2725. – 2011-06-10 21:02:00

+0

所有包含LOB列的索引或僅包含聚簇索引的索引? – esac 2011-06-10 21:06:47

6

在鎖定表格時,在線索引重建不那麼具有侵入性。脫機重建會導致表的大量鎖定,這可能會導致在重建發生時嘗試訪問數據庫的事件發生重大阻塞問題。

「表鎖在索引操作期間[在脫機重建期間]應用。創建,重建或刪除集羣,空間或XML索引或重建或刪除非聚集索引的脫機索引操作,獲取表上的Schema修改(Sch-M)鎖,這將阻止所有用戶在操作期間訪問基礎表。創建非聚集索引的脫機索引操作會獲取表上的Shared(S)鎖。這樣可以防止更新底層表,但允許讀取操作,例如SELECT語句。「

http://msdn.microsoft.com/en-us/library/ms188388(v=sql.110).aspx

此外聯機索引重建是一個企業(或開發商)版本纔有的功能。

1

的主要區別是:

1)OFFLINE索引重建快於ONLINE重建。

2)在SQL Server聯機索引重建過程中需要額外的磁盤空間。

3)通過SQL Server聯機索引重建獲取SQL Server鎖。

  • 此架構修改鎖定會阻止對該表的所有其他併發訪問,但它只保留很短的時間,同時刪除舊索引並更新統計信息。
相關問題