重新組織 vs 重新生成索引

2022-04-28 16:12:06 字數 1951 閱讀 5494

索引是資料庫引擎中針對表(有時候也針對檢視)建立的特別資料結構,用來幫助查詢和整理資料。索引的重要性體現在能夠使資料庫引擎快速返回查詢 結果。當對索引所在的基礎資料表進行修改時(包括插入、刪除和更新等操作),會導致索引碎片的產生。當索引的邏輯排序和基礎表或檢視的物理排序不匹配時, 就會產生索引碎片。隨著索引碎片的不斷增多,查詢響應時間就會變慢,查詢效能也會下降。在sql server 2005中,要解決這個問題,要麼重新組織索引要麼重新生成索引。

重新組織vs重新生成

修復索引碎片的方法有兩種:重新組織索引或重新生成索引。重新組織索引會對最外層資料頁裡的資料進行重新排序,並壓縮索引頁。重新組織的過程中 不會新增任何額外的資料,所以索引可能還殘留著一定程度的碎片。重新組織索引操作不會占用很多系統資源,在執行過程中外部程序也能夠對該索引所在的資料表 進行查詢,所以能夠說是聯機(online)執行。

重新生成索引操作基本上刪除掉目標索引並建立乙個新索引。舊索引中的任何碎片都會被刪除,新索引的邏輯排序將和物件的物理排序相匹配。由於整個 過程需要刪除索引並重新建立,所以外部程序無法訪問資料表,而且訪問效能也大受影響。事實上,在重新生成索引的過程中,其他程序並不能完全鎖定資料表。這 是重新生成索引的一大障礙。

聯機重新生成索引

sql server 2005引進了以聯機方式重新生成索引的能力,這樣其他程序就能夠在此過程中正常訪問資料表,而且也就無需限制在非繁忙時段進行索引重新生成操作。

要做到聯機操作,資料庫引擎會採取若干特別配置,以便在重新生成索引的同時允許對該索引的訪問。首先,將保留原始索引以供使用者讀取資料和對資料 進行修改。其次通過行版本控制(row versioning,在tempdb資料庫儲存舊版本的行的過程)使事務讀取保持連貫性。在重新生成過程中,仿效舊索引建立乙個新索引。任何改變原始索 引的資料修改操作都會在重新生成索引的過程中被sql server引用到新索引中。新索引不能讀取,只能對其進行寫入操作。關鍵的一點是,聯機重新生成索引過程中必須為兩個併發索引提供足夠的磁碟空間來容納 資料。重建進行的過程中,假如原始索引發生改變,sql server會利用乙個對映索引來確定新索引中哪些記錄需要進行相應修改。一旦重新生成的過程順利完成,任何查詢或資料修改操作都將指向新索引,同時刪除 原始索引。

例子

聯機重新生成索引的過程和一般的重新生成索引過程沒有太大區別。但是,能夠通過幾個方法來完成整個重生過程。第乙個方法就是簡單地刪除索 引,create index語句後加上一條drop index就能夠。用這種方式重新生成索引會使資料表保持沒有索引的狀態直到新索引完全建立完畢。所以並不推薦使用這種方法來刪除索引。

假如使用drop_existing語句,仍然能夠用create index來重新生成索引。這個特點使我們能夠改變指定索引的定義,並且使資料庫管理員能夠把索引的儲存位置改到另外乙個文件組或分割槽裡。

alter index語句使我們能夠重新生成資料表上的聚集索引和任何非聚集索引。這個語句的缺點是,您不能改變索引的定義。這些語句都含有能夠聯機生成索引的選項。

以下的語句是用來重新生成flighthistory表上的聚集索引(位於flightid列)。在這個過程中,既存的索引將會被刪除,但是由於指定了online選項,所以在操作過程中該索引還能夠被訪問。

以下是引用片段:

create clustered index cl_flighthistory_flightid on flighthistory(flightid) 

with(drop_existing = on, online = on)

下面的語句和上面的很相似,但是改變實際的索引定義,包含了乙個額外列。索引還是按照相同的方式重新生成。

以下是引用片段:

create clustered index cl_flighthistory_flightid on flighthistory(flightid asc, flightdate asc) 

with(drop_existing = on, online = on)

重新生成索引及重新組織索引

索引是資料庫引擎中針對表 有時候也針對檢視 建立的特別資料結構,用來幫助查詢和整理資料。索引的重要性體現在能夠使資料庫引擎快速返回查詢 結果。當對索引所在的基礎資料表進行修改時 包括插入 刪除和更新等操作 會導致索引碎片的產生。當索引的邏輯排序和基礎表或檢視的物理排序不匹配時,就會產生索引碎片。隨著...

重新組織資料

將乙個值用於多個用途,就是催生混亂與bug的溫床 1.拆分變數 如果乙個變數有多個用途,就為每個用途宣告乙個變數。還有,如果要對引數改值,也先複製乙份,對副本改值,返回副本。2.字段改名 給字段取乙個準確的名字。好的命名及資料分布,能讓別人只看類的字段就理解這些類的行為。3.以查詢取代派生變數 盡量...

重新組織資料(一)

1,self encapsulate field 自封裝自段 現象 你直接訪問乙個字段,但與字段直接的耦合關係逐漸變得笨拙 要點 為這個字段建立取值 設定函式,並且只以這些函式來訪問字段。2,replace data value with object 以物件取代資料值 現象 你有乙個資料項,需要與...