PostgreSQL+VACUUM+運(yùn)行機(jī)制探究+-+宋少華_第1頁
PostgreSQL+VACUUM+運(yùn)行機(jī)制探究+-+宋少華_第2頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、探究VACUUM運(yùn)行機(jī)制宋少華PART 01VACUUM 介紹VACUUM 概念VACUUM 用于回收死元組占用的存儲空間。這些死元組是由于通過更新過期或者刪用于回收死元組占用的存儲空間。這些死元組是由于通過更新過期或者刪除的元組不會從表中進(jìn)行物理移除,直到執(zhí)行一個除的元組不會從表中進(jìn)行物理移除,直到執(zhí)行一個 VACUUM 操作完成后才會被從表對應(yīng)操作完成后才會被從表對應(yīng)的物理文件中移除。因此在頻繁更新的表上需要定期執(zhí)行的物理文件中移除。因此在頻繁更新的表上需要定期執(zhí)行 VACUUM 操作操作。VACUUM 執(zhí)行操作,正常情況下,對執(zhí)行操作,正常情況下,對 dead_tuple 僅僅進(jìn)行回收但

2、并不釋放空間,以僅僅進(jìn)行回收但并不釋放空間,以便空間可以重新使用而不需要再重新分配空間,如果帶有便空間可以重新使用而不需要再重新分配空間,如果帶有 FULL 參數(shù),那么回收參數(shù),那么回收 dead_tuple 并釋放空間。并釋放空間。VACUUM 原理對于不帶有對于不帶有 FULL 參數(shù)的參數(shù)的 VACUUM ,僅僅將,僅僅將 dead tuple 從表對應(yīng)的物理文件中標(biāo)識從表對應(yīng)的物理文件中標(biāo)識移除,但是不釋放空間。此刻,表對象數(shù)據(jù)文件依然使用同一個數(shù)據(jù)文件。移除,但是不釋放空間。此刻,表對象數(shù)據(jù)文件依然使用同一個數(shù)據(jù)文件。對于帶有對于帶有 FULL 參數(shù)的參數(shù)的 VACUUM ,該操作實際

3、將表對應(yīng)的物理文件內(nèi)容重寫到新的,該操作實際將表對應(yīng)的物理文件內(nèi)容重寫到新的磁盤文件中,從而釋放磁盤空間。磁盤文件中,從而釋放磁盤空間。對于沒有對于沒有 FULL參數(shù)的參數(shù)的 VACUUM 操作,由于沒有排他鎖,表可以正常讀取和寫入。操作,由于沒有排他鎖,表可以正常讀取和寫入。對于有對于有 FULL 參數(shù)的參數(shù)的 VACUUM 操作,會獲取表排他鎖,因此比不帶操作,會獲取表排他鎖,因此比不帶 FULL 參數(shù)要慢。參數(shù)要慢。VACUUM 基礎(chǔ)VACUUM處理表的目的: 恢復(fù)或者重用由UPDATE 和 DELETE 刪除元組后占用的磁盤空間 更新由 PostgreSQL 查詢計劃器使用的數(shù)據(jù)統(tǒng)計信

4、息 更新可見性映射,可以加快 index-only scan 的速度 保護(hù)由于事務(wù) ID 循環(huán)處理或者多個事務(wù)ID循環(huán)處理導(dǎo)致老舊數(shù)據(jù)的丟失VACUUM 基礎(chǔ)VACUUM 方式有以下兩種: VACUUM VACUUM FULLVACUUM FULL 可以回收磁盤空間但是運(yùn)行很慢。而VACUUM 可以在并行運(yùn)行在生產(chǎn)數(shù)據(jù)庫中。在執(zhí)行 VACUUM 期間,DML 和DQL 語句可以正常運(yùn)行,但是此時不能在表對象上執(zhí)行表定義操作。VACUUM FULL 運(yùn)行期間,將會獲取表中的排他鎖,因此不能并行執(zhí)行。通常情況下,建議使用 VACUUM,而不是 VACUUM FULL。VACUUM 更新表統(tǒng)計信息

5、VACUUM 通過通過 ANALYZE 可更新表對象統(tǒng)計信息??筛卤韺ο蠼y(tǒng)計信息。PostgreSQL 查詢計劃器通過表對查詢計劃器通過表對象統(tǒng)計信息生成查詢計劃??梢酝ㄟ^象統(tǒng)計信息生成查詢計劃??梢酝ㄟ^ VACCUM 的可選選項的可選選項 ANALYZE 在對在對 dead tuple 標(biāo)標(biāo)記或者清理時同時更新表統(tǒng)計信息,以便于查詢計劃器生成更好的執(zhí)行計劃。記或者清理時同時更新表統(tǒng)計信息,以便于查詢計劃器生成更好的執(zhí)行計劃。對于對于 autovacuum 啟用狀態(tài)下,啟用狀態(tài)下,PostgreSQL 將會自動執(zhí)行將會自動執(zhí)行 ANALYZE 命令。命令。PART 02VM介紹可見性映射VM

6、VM 是可見性映射文件表,每一個表都有可見性映射文件,以跟蹤頁面中包含已知對是可見性映射文件表,每一個表都有可見性映射文件,以跟蹤頁面中包含已知對所有活躍事務(wù)可見的元組,同時也跟蹤頁面僅包含凍結(jié)的元組。該文件命名以表對象所有活躍事務(wù)可見的元組,同時也跟蹤頁面僅包含凍結(jié)的元組。該文件命名以表對象 oid作為前綴,作為前綴,_vm 作為后綴存在。作為后綴存在??梢娦杂成涫且粋€位圖,每個可見性映射是一個位圖,每個heap page 都有兩個位,表示全部頁面可見和全部頁面凍都有兩個位,表示全部頁面可見和全部頁面凍結(jié)。如果可見位被設(shè)置,意味著頁面上所有元組對于所有事務(wù)都是可見的,因此該頁面不結(jié)。如果可見

7、位被設(shè)置,意味著頁面上所有元組對于所有事務(wù)都是可見的,因此該頁面不需要清理。如果凍結(jié)位被設(shè)置,意味著頁面上所有的元組都被完全凍結(jié),因此即使需要對需要清理。如果凍結(jié)位被設(shè)置,意味著頁面上所有的元組都被完全凍結(jié),因此即使需要對整個表進(jìn)行整個表進(jìn)行vacuum(如如:anti-wraparound),也無需要對該頁面進(jìn)行,也無需要對該頁面進(jìn)行 vacuum處理。僅當(dāng)頁面處理。僅當(dāng)頁面全部已經(jīng)可見時,才需要對全凍結(jié)位設(shè)置。全部已經(jīng)可見時,才需要對全凍結(jié)位設(shè)置。VACUUM 基礎(chǔ)之可見性映射VMsrc/include/access/visibilitymap.h/* 每個堆頁面上的位數(shù)定義*/ #def

8、ine BITS_PER_HEAPBLOCK 2/* 位映射標(biāo)識 */ #define VISIBILITYMAP_ALL_VISIBLE 0 x01 #define VISIBILITYMAP_ALL_FROZEN 0 x02 #define VISIBILITYMAP_VALID_BITS 0 x03 /*所有可見的位映射標(biāo)識*/可見性映射位VM清除可見性映射位不會單獨進(jìn)行清除可見性映射位不會單獨進(jìn)行 WAL 記錄。調(diào)用者只要確認(rèn)位被清除,那么記錄。調(diào)用者只要確認(rèn)位被清除,那么WAL在在重放時,位也將被清除。重放時,位也將被清除。如果沒有設(shè)置任何位,有可能或者當(dāng)在如果沒有設(shè)置任何位,有可能

9、或者當(dāng)在VACUUM 期間設(shè)置一個可見性映射時,必須期間設(shè)置一個可見性映射時,必須要寫入要寫入 WAL。頁面本身上的。頁面本身上的 PD_ALL_VISIBLE位和可見性映射位被放置一起。因此,如位和可見性映射位被放置一起。因此,如果可見性映射頁寫入到磁盤后和更新堆頁面在寫入磁盤之前,如果實例發(fā)生崩潰,該堆頁果可見性映射頁寫入到磁盤后和更新堆頁面在寫入磁盤之前,如果實例發(fā)生崩潰,該堆頁面上該位必須被重置面上該位必須被重置(redo)。否則在堆頁面上進(jìn)行下一次。否則在堆頁面上進(jìn)行下一次 INSERT,UPDATE或者或者DELETE將無法知道必須清除可見性映射位,從而導(dǎo)致索引掃描返回錯誤。將無法

10、知道必須清除可見性映射位,從而導(dǎo)致索引掃描返回錯誤??梢娦杂成淇梢娦杂成湮蝗绾吻宄谠?heapam.c 中,只要修改頁面使該頁面上的所有元組不再對所有人可見,則清除可見中,只要修改頁面使該頁面上的所有元組不再對所有人可見,則清除可見性映射中的相應(yīng)位。為了確保性映射中的相應(yīng)位。為了確保 crash-safe,需要在保持鎖定的堆頁面以及日志頁面修改的,需要在保持鎖定的堆頁面以及日志頁面修改的同一關(guān)鍵部分保持鎖定。但是,為了避免在可見性映射頁面中讀取任何同一關(guān)鍵部分保持鎖定。但是,為了避免在可見性映射頁面中讀取任何I/O時保持緩沖區(qū)時保持緩沖區(qū)鎖定,需要在鎖定堆頁面之前對其進(jìn)行檢查,如果鎖定,需要

11、在鎖定堆頁面之前對其進(jìn)行檢查,如果 page-level PD_ALL_VISIBLE 位被設(shè)位被設(shè)置,則固定可見性映射位。然后,對緩沖區(qū)進(jìn)行鎖定。但此刻會產(chǎn)生競爭:在鎖定緩沖區(qū)置,則固定可見性映射位。然后,對緩沖區(qū)進(jìn)行鎖定。但此刻會產(chǎn)生競爭:在鎖定緩沖區(qū)的時候,的時候,PD_ALL_VISILBE 位被設(shè)置了。如果發(fā)生這種情況,應(yīng)該解鎖緩沖區(qū),固定可位被設(shè)置了。如果發(fā)生這種情況,應(yīng)該解鎖緩沖區(qū),固定可見性映射頁面,然后重新鎖定緩沖區(qū)。但該情況很少發(fā)生,因為當(dāng)前只有見性映射頁面,然后重新鎖定緩沖區(qū)。但該情況很少發(fā)生,因為當(dāng)前只有 VACUUM 設(shè)置設(shè)置可見性位,并且僅當(dāng)可見性位,并且僅當(dāng) VA

12、CUUM 在處理指定頁面的同時有人修改的情況下,才會發(fā)生競爭。在處理指定頁面的同時有人修改的情況下,才會發(fā)生競爭。詳細(xì)請參考詳細(xì)請參考(src/backend/access/heap/heapam.c中的代碼中的代碼)可見性映射可見性映射位如何清除設(shè)置位時,需要在堆頁面上保持鎖定,這樣可以防止出現(xiàn)競爭情形,即設(shè)置位時,需要在堆頁面上保持鎖定,這樣可以防止出現(xiàn)競爭情形,即VACUUM 看看到頁面上的所有元組對所有人都可見,但另外一個后端會在到頁面上的所有元組對所有人都可見,但另外一個后端會在 VACUUM 設(shè)置可見性映射位設(shè)置可見性映射位之前修改頁面。之前修改頁面。當(dāng)位已被設(shè)置后,將更新可見性映

13、射頁面的當(dāng)位已被設(shè)置后,將更新可見性映射頁面的LSN,以確保在刷新可以設(shè)置該位的,以確保在刷新可以設(shè)置該位的 WAL 記錄之前,不會將可見性視圖更新寫入磁盤。當(dāng)位被清除后,就不需要該操作了。記錄之前,不會將可見性視圖更新寫入磁盤。當(dāng)位被清除后,就不需要該操作了??梢娦杂成鋽U(kuò)展pg_visibility該擴(kuò)展提供檢查表的可見性映射和頁面級可見性信息的方式,同時提供了對可見性映該擴(kuò)展提供檢查表的可見性映射和頁面級可見性信息的方式,同時提供了對可見性映射進(jìn)行強(qiáng)制并對其進(jìn)行重建的函數(shù)。射進(jìn)行強(qiáng)制并對其進(jìn)行重建的函數(shù)。三個不同的位通常用來存儲頁級可見性信息。三個不同的位通常用來存儲頁級可見性信息。VIS

14、IBILITYMAP_ALL_VISIBLE 位表明表頁面中的每一個元組對于當(dāng)前和將來的事位表明表頁面中的每一個元組對于當(dāng)前和將來的事務(wù)都是可見的。務(wù)都是可見的。VISIBILITYMAP_ALL_FROZEN 位表明表頁面中的所有元組是被凍結(jié)的,即在元組位表明表頁面中的所有元組是被凍結(jié)的,即在元組被被INSERT,UPDATE,DELETE或者鎖定該頁面前,將來不在需要修改的頁面?;蛘哝i定該頁面前,將來不在需要修改的頁面。頁頭中的頁頭中的PD_ALL_VISIBLE 位與位與 ALL_VISIBLE位相同,只不過其存儲在數(shù)據(jù)頁本身。位相同,只不過其存儲在數(shù)據(jù)頁本身。PART 03凍結(jié)凍結(jié)過程

15、原理凍結(jié)過程有兩種:一種是凍結(jié)過程有兩種:一種是lazy 凍結(jié),一種是凍結(jié),一種是 aggressive 凍結(jié)。凍結(jié)。在在 lazy 模式下,凍結(jié)過程僅使用表對應(yīng)的空閑空間映射文件中包含死元組的頁面。在模式下,凍結(jié)過程僅使用表對應(yīng)的空閑空間映射文件中包含死元組的頁面。在Aggressive 模式下,凍結(jié)過程會對表的整個頁面進(jìn)行掃描。無論該表頁面中是否包含模式下,凍結(jié)過程會對表的整個頁面進(jìn)行掃描。無論該表頁面中是否包含有死元組。并且在可能的情況下才會移除有死元組。并且在可能的情況下才會移除xact(clog)文件。)文件。凍結(jié)相關(guān)概念解釋概念在源代碼概念在源代碼src/backend/comma

16、nds/vacuum.c:859行行vacuum_set_xid_limits()中描述中描述oldestXmin:用來區(qū)分元組是用來區(qū)分元組是DEAD或者是或者是RECENTLY_DEAD的截斷值的截斷值frozenLimit:在在VACUUM期間,所有的期間,所有的xids低于該低于該xid 的都將使用的都將使用frozenLimit替換,即凍結(jié)替換,即凍結(jié)該該xid。xidFullScanLimit:根據(jù)根據(jù) table_freeze_age參數(shù)計算,表示最小的參數(shù)計算,表示最小的xid值。若值。若relforzenxid大于大于該表的表都會被該表的表都會被VACUUM,以此來凍結(jié)整個表

17、中的元組。小于此值的表只掃描,以此來凍結(jié)整個表中的元組。小于此值的表只掃描VM包含死元組包含死元組的頁面。的頁面。multiXactCutoff:對低于該值的對低于該值的xid,從,從xmax中移除所有的中移除所有的multixactidsmxactFullScanLimit:與與xidFullScanlimit類似。類似。補(bǔ)充:對于補(bǔ)充:對于oldestXmin 可以參考源代碼可以參考源代碼 src/backend/access/heap/heapam_visibility.c:1150行行中的描述中的描述凍結(jié)相關(guān)概念解釋freezeLimit_txid計算:計算:src/backend/c

18、ommands/vacuum.c:929 行行l(wèi)imit = *oldestXmin - freezemin;其中其中oldestXmin為當(dāng)前運(yùn)行事務(wù)中最早的事務(wù)標(biāo)識。如有為當(dāng)前運(yùn)行事務(wù)中最早的事務(wù)標(biāo)識。如有T1,T2,T3 三個事務(wù),三個事務(wù),xid分別為分別為 100,101和和102,那么最早的事務(wù)的,那么最早的事務(wù)的ID應(yīng)該為應(yīng)該為T1=100。Freezemin數(shù)據(jù)庫默認(rèn)值為數(shù)據(jù)庫默認(rèn)值為50000000.Lazy 模式下的凍結(jié)示例假設(shè)當(dāng)前最早的事務(wù)標(biāo)識大于假設(shè)當(dāng)前最早的事務(wù)標(biāo)識大于freezemin,即設(shè)定為,即設(shè)定為 50000800,那么在該模式下凍結(jié)的,那么在該模式下凍結(jié)的

19、limit 應(yīng)該為應(yīng)該為 50000800 50000000 ,即,即 limit 為為800。凍結(jié)過程如下:。凍結(jié)過程如下:假設(shè)位于假設(shè)位于0號塊在號塊在tuple1上行片頭插入事務(wù)的上行片頭插入事務(wù)的t_xmin為為 600,tuple2的的t_xmin 為為610,tuple3的的t_xmin 為為 620。位于。位于 1 號塊在號塊在tuple4的行片頭插入事務(wù)的的行片頭插入事務(wù)的t_xmin 為為630,tuple5的的t_xmin為為640。位于。位于 2 號塊在號塊在 tuple6 的行片頭插入事務(wù)的的行片頭插入事務(wù)的t_xmin為為 650,tuple7的的t_xmin為為66

20、0,tuple8 的的t_xmin 為為900。那么再次假設(shè)在。那么再次假設(shè)在tuple1 上上UPDATE或者或者DELETE后的后的 t_xmax 為為 700,在,在tuple6上的上的t_xmax 為為 750。此刻凍結(jié)過程進(jìn)行如下:第。此刻凍結(jié)過程進(jìn)行如下:第 0 號頁面上的三號頁面上的三條元組的條元組的t_xmin小于小于 limit 的值,因此都將被凍結(jié),并且的值,因此都將被凍結(jié),并且tuple1上面有刪除標(biāo)識,因此清理上面有刪除標(biāo)識,因此清理時將被移除,時將被移除,1號頁面在號頁面在VM中對所有元組可見,則跳過清理。中對所有元組可見,則跳過清理。2號頁面的號頁面的tuple6和

21、和tuple7將將被凍結(jié),被凍結(jié),tuple 7被移除。被移除。Lazy 模式下的凍結(jié)示例Lazy 模式下的凍結(jié)示例Lazy 模式下的凍結(jié)示例Lazy 模式下的凍結(jié)示例Lazy 模式下的凍結(jié)示例Lazy 模式下的凍結(jié)示例Aggressive模式下的凍結(jié)因為在因為在lazy 模式下,如果一個頁面上的所有元組對于當(dāng)前事務(wù)或者未來事務(wù)可見,并模式下,如果一個頁面上的所有元組對于當(dāng)前事務(wù)或者未來事務(wù)可見,并且沒有死元組的情況下,且沒有死元組的情況下,VACUUM 將會跳過這些頁面,因此如果元組中的將會跳過這些頁面,因此如果元組中的xid 都小于凍結(jié)都小于凍結(jié)的的limit 的的id,那么這些需要凍結(jié)的

22、行由于跳過頁面檢查而導(dǎo)致沒有凍結(jié)。所以這也是,那么這些需要凍結(jié)的行由于跳過頁面檢查而導(dǎo)致沒有凍結(jié)。所以這也是lazy 模式下的一種缺陷。模式下的一種缺陷。而而 aggressive 模式彌補(bǔ)了該缺陷,因為該模式將會掃描所有的頁面,并檢查所有元組模式彌補(bǔ)了該缺陷,因為該模式將會掃描所有的頁面,并檢查所有元組及更新相關(guān)的系統(tǒng)視圖,并在必要時刪除不需要的及更新相關(guān)的系統(tǒng)視圖,并在必要時刪除不需要的xact(CLog) 文件與頁面。文件與頁面。Aggressive 模式需要滿足模式需要滿足 pg_database.datfrozenxid (OldestXmin vacuum_freeze_table

23、_age)條件才會被使用。條件才會被使用。Aggressive模式下的凍結(jié)Datfrozenxied是系統(tǒng)表是系統(tǒng)表 pg_database中的一列,該列中保存每個數(shù)據(jù)庫最老的已凍結(jié)中的一列,該列中保存每個數(shù)據(jù)庫最老的已凍結(jié)的事務(wù)標(biāo)識。的事務(wù)標(biāo)識。Vacuum_freeze_table_age 默認(rèn)值為默認(rèn)值為1.5億。億。t_xmint_xmax0100010101010110202103020402040999910010假設(shè)現(xiàn)在系統(tǒng)當(dāng)前的最早的事務(wù)OldestXmin為12000,而vacuum_freeze_min_age的值為 10000 ,假設(shè)vacuum_freeze_table

24、_age 為 10000凍結(jié)點的事務(wù)id為2000。此刻0號頁面的元組都會被凍結(jié),1并進(jìn)行掃描檢查。1號頁面元組凍結(jié),在lazy 模式下跳過該頁。2號頁面,9999將會被凍結(jié),10010不會被凍結(jié)。PART 04VACUUM 源碼VACUUM 相關(guān)的源碼文件src/include/commands/vacuum.hsrc/include/access/visibilitymap.hsrc/include/nodes/parsenodes.hsrc/backend/access/heap/pruneheap.csrc/backend/access/heap/vacuumlazy.csrc/bac

25、kend/commands/vacuum.csrc/backend/storage/page/bufpage.csrc/backend/storage/freespace/freespace.cVACUUM 源碼解讀src/include/commands/vacuum.h 定義 vacuum 選項typedef enum VacuumOption VACOPT_VACUUM = 1 0, /* 1 執(zhí)行VACUUM */ VACOPT_ANALYZE = 1 1, /* 2 執(zhí)行ANALYZE */ VACOPT_VERBOSE = 1 2, /* 4 輸出進(jìn)度信息 */ VACOPT_FR

26、EEZE = 1 3, /* 8 凍結(jié)選項 */ VACOPT_FULL = 1 4, /* 16 非并發(fā)下的FULL VACUUM */ VACOPT_SKIP_LOCKED = 1 5, /* 32 沒有鎖定則跳過 */ VACOPT_SKIPTOAST = 1 6, /* 64 不處理TOAST表 */ VACOPT_DISABLE_PAGE_SKIPPING = 1 7 /* 128 全頁掃描 */ VacuumOption;VACUUM 源碼解讀src/include/commands/nodes/parsenodes.h/* - Vacuum and Analyze 語句 *名義上

27、定義了兩個語句,實際上僅僅是為了執(zhí)行起來方便 * - */ typedef struct VacuumStmt NodeTag type; List *options; /* 列出選項語句標(biāo)簽選項類型 */ List *rels; /* VACUUM 關(guān)系鏈表, 如果為 NIL,表示對所有表進(jìn)行VACUUM */ bool is_vacuumcmd; /* 如果是True則為VACUUM,如果是False則為ANALYZE */ VacuumStmt;VACUUM 源碼解讀/* - Vacuum and Analyze 語句 *名義上定義了兩個語句,實際上僅僅是為了執(zhí)行起來方便 * - */

28、typedef struct VacuumStmt NodeTag type; List *options; /* 列出選項語句標(biāo)簽選項類型 */ List *rels; /* VACUUM 關(guān)系鏈表, 如果為 NIL,表示對所有表進(jìn)行VACUUM */ bool is_vacuumcmd; /* 如果是True則為VACUUM,如果是False則為ANALYZE */ VacuumStmt;VACUUM 源碼解讀/* * 單個目標(biāo)表的VACUUM和ANALYZE. * 如果設(shè)置了OID,表明對該表進(jìn)行處理. * 表字段可以為空; 如果沒有,僅用來報告該關(guān)系open/lock失敗的狀況 */

29、typedef struct VacuumRelation NodeTag type; RangeVar *relation; /* 表名處理, 或者NULL */ Oid oid; /* 表OID,無效OID不會被查找 */ List *va_cols; /* 列名鏈表, 如果為 NIL for all */ VacuumRelation;VACUUM 源碼解讀/* * 自定義 VACUUM and ANALYZE. VACOPT_VACUUM and VACOPT_ANALYZE 至少要有一個被設(shè)置 */ typedef struct VacuumParams int options; /

30、* VacuumOption 掩碼位*/ int freeze_min_age; /* 最小凍結(jié)age,默認(rèn)為-1 */ int freeze_table_age; /* 掃描整個表的age */ int multixact_freeze_min_age; /* 最小的 multixact凍結(jié) age,默認(rèn)使用-1 */ int multixact_freeze_table_age; /* 掃描整個表的multixact age */ bool is_wraparound; /* 對于 for-wraparound 強(qiáng)制vacuum */ int log_min_duration; /* 輸出

31、執(zhí)行時間以ms為單位, 默認(rèn)為-1*/ VacOptTernaryValue index_cleanup; /*索引清理*/ VacOptTernaryValue truncate; /* Truncate末尾空頁*/ VacuumParams; VACUUM 清理主要通過vacuum 函數(shù)實現(xiàn),實現(xiàn)過程如下開始預(yù)處理獲取鏈表最后一張表結(jié)束是否調(diào)用Vacuum_rel,如果有可選ANALYZE,還需要對表清理后更新統(tǒng)計信息加鎖權(quán)限檢查是否需要清理需要調(diào)用vacuum_rel heap_vacuum_relVACUUM 源碼解讀通過上面流程圖可以看出,VACUUM 會使用兩種方式進(jìn)行清理表,la

32、zy vacuum 和 full vacuum。實際上lazy vacuum 僅僅標(biāo)記碎片為可用,以便于新數(shù)據(jù)重用該空間,并且不會回收空閑空間給操作系統(tǒng),因此文件不會變小,這種操作可以在并發(fā)情況下進(jìn)行。而 full vacuum 則將會使用激進(jìn)的方式來回收碎片空間。通過VACUUM FULL 回收的空間都立即返還給操作系統(tǒng)。但是在進(jìn)行VACUUM FULL 操作時需要加排他鎖,因此不能并發(fā)進(jìn)行。VACUUM 源碼解讀lazy VACUUMLazy VACUUM 在12版本以前使用函數(shù) lazy_vacuum_rel,在12版本以后已經(jīng)被更名為heap_vacuum_rel函數(shù)heap_vacuum_rel 函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論