大數(shù)據(jù)“復(fù)活”記
1222
2025-03-31
GaussDB(DWS) VACUUM總結(jié)
摘要:在GaussDB(DWS)中,VACUUM的本質(zhì)就是一個“吸塵器”,用于吸收“塵埃”。而塵埃其實就是舊版本數(shù)據(jù),如果這些數(shù)據(jù)沒有及時清理,那么將會導(dǎo)致數(shù)據(jù)庫空間膨脹,性能下降,更嚴重的情況會導(dǎo)致宕機。下面將從VACUUM的作用、用法、原理等方面進行介紹。
1 VACUUM的作用
1)空間膨脹問題:清除廢舊元組以及相應(yīng)的索引。包括提交的事務(wù)delete的元組(以及索引)、update的舊版本(以及索引),回滾的事務(wù)insert的元組(以及索引)、update的新版本(以及索引)、copy導(dǎo)入的元組(以及索引)。
2)freeze:防止因事務(wù)ID回卷問題(Transaction ID wraparound)而導(dǎo)致的宕機,將小于OldestXmin的事務(wù)號轉(zhuǎn)化為freeze xid,更新表的relfrozenxid,更新庫的relfrozenxid,truncate clog。
3)更新統(tǒng)計信息:VACUUM analyze時,會更新統(tǒng)計信息,使得優(yōu)化器能夠選擇更好的方案執(zhí)行sql。
2 VACUUM命令
VACUUM 命令存在兩種形式,VACUUM和VACUUM FULL,VACUUM命令做的是LAZY VACUUM。從字面意思就可以看出來,LAZY VACUUM是VACUUM FULL的簡化版。具體區(qū)別見下表。
LAZY VACUUM
VACUUM FULL
空間清理
如果刪除的記錄位于表的末端,其所占用的空間將會被物理釋放并歸還操作系統(tǒng)。而如果不是末端數(shù)據(jù),會將表中或索引中dead tuple(死亡元組)所占用的空間置為可用狀態(tài),從而復(fù)用這些空間
不論被清理的數(shù)據(jù)處于何處,這些數(shù)據(jù)所占用的空間都將被物理釋放并歸還于操作系統(tǒng)。當再有數(shù)據(jù)插入后,分配新的磁盤頁面使用
鎖類型
共享鎖,可以與其他操作并行
排他鎖,執(zhí)行期間基于該表的操作全部掛起
物理空間
不會釋放
會釋放
事務(wù)ID
不回收
回收
執(zhí)行開銷
開銷較小,可以定期執(zhí)行
開銷巨大,建議確認數(shù)據(jù)庫所占磁盤頁面空間接近臨界值再執(zhí)行操作,且最好選擇數(shù)據(jù)量操作較少的時段完成
執(zhí)行效果
執(zhí)行后會有所提升
執(zhí)行完后,基于該表的操作效率大大提升
注:目前LAZY VACUUM只對行存表起作用,對列存表無效,列存表只能依靠VACUUM FULL釋放空間。
VACUUM在GaussDB(DWS)中具體執(zhí)行語法如下:
1)回收空間并更新統(tǒng)計信息,對關(guān)鍵字順序無要求
VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE } [, ...] ) ] [ table_name [ (column_name [, ...] ) ] ]
2)僅回收空間,不更新統(tǒng)計信息
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]
3)回收空間并更新統(tǒng)計信息,且對關(guān)鍵字順序有要求
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]
重要參數(shù)說明:
FULL 選擇VACUUM FULL清理,可以恢復(fù)更多空間,但耗時更多。
FREEZE指定FREEZE相當于執(zhí)行VACUUM時將VACUUM_freeze_min_age參數(shù)設(shè)為0。
VERBOSE為每個表打印一份詳細的清理工作
ANALYZE | ANALYSE更新用于優(yōu)化器的統(tǒng)計信息,以決定執(zhí)行查詢的最有效方法。
3 VACUUM原理
3.1 LAZY VACUUM執(zhí)行流程
(1)從指定的多張表中進行遍歷,從而獲取每一個表。
(2)獲取遍歷到表的共享鎖,該鎖允許其他事務(wù)讀取。
(3)獲取每個頁面的dead tuples(死亡元組),并freeze需要的元組。
(4)刪除指向dead tuples的元組。
(5)刪除dead tuples并重新分配live tuples(活動元組)。
(6)更新目標表的FSM(用于記錄每個數(shù)據(jù)塊的空閑空)和VM(標記數(shù)據(jù)塊中是否存在需要清理的行)。
(7)重復(fù)5,6步驟直到遍歷完該表的每一頁.
(8)如果最后一頁沒有元組,則進行截斷。
(9)更新與VACUUM有關(guān)的統(tǒng)計信息表和系統(tǒng)目錄。
3.2 VACUUM FULL執(zhí)行流程
(1)建立臨時表:數(shù)據(jù)庫創(chuàng)建一張臨時表,該表繼承老表的所有屬性。如果用戶表有名字與這個臨時表相同的,那么就會失敗。在該階段申請的行排他鎖(RowExclusiveLock)。
(2)數(shù)據(jù)復(fù)制:將原來表中的數(shù)據(jù)復(fù)制到臨時表中。在該過程中完成堆dead tuples的清理。該階段申請的是訪問排他鎖AccessExclusiveLock。
(3)交換表:使用新表代替老表。而交換的本質(zhì)是物理文件的交換,即臨時表帶老物理文件,老表帶新物理文件。該階段會再次申請行排他鎖(RowExclusiveLock)。
(4)重建索引:當交換完成后,會進行索引重建,并更新統(tǒng)計信息。此時對表申請共享鎖(ShareLock)。
(5)刪除臨時表:索引重建完成后,會將帶有老物理文件的臨時表進行刪除。
EI企業(yè)智能 Gauss AP 數(shù)據(jù)倉庫服務(wù) GaussDB(DWS)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。