數據膨脹了?又沒有空間了?一招教你解決

      網友投稿 693 2025-03-31

      GaussDB(DWS)行存表的數據膨脹與空間重用

      需求介紹

      數據膨脹,指的是物理數據文件的大小明顯高于實際存儲的數據量。 甚至某些特殊場景下,一個表中只有一條簡單的數據,但是表對應的物理文件可能已經達到M級甚至G級。

      為了解決數據膨脹,GaussDB(DWS)通過vacuum和FSM來清理和重用物理空間。 本文簡單介紹FSM的設計和原理,并通過一個例子對FSM功能進行簡單的測試和驗證。

      數據膨脹的原因

      想弄清楚數據膨脹的原因,首先要了解GaussDB(DWS)行存表數據基于MVCC的存儲機制:

      INSERT很簡單,就是將元組插入到頁面的空閑空間中;

      DELETE則是將元組標記為舊版本,但是即使這個舊版本對所有事務都不可見了,這個元組占用的空間也不會歸還給文件系統;

      UPDATE相當于DELETE+INSERT,等于是占用了兩條元組的位置,類似DELETE,舊版本的元組依然占用著物理空間。

      很明顯,在一通增刪改操作之后,頁面上的舊版本元組勢必是占有一定比重的。這就導致了物理文件大小明顯高于實際的數據量。

      設計方案

      為了解決無效元組占用空間的問題,GaussDB(DWS)提供了vacuum功能,在舊版本元組過期(對所有事務都不可見)后,vacuum可以將元組物理刪除,這樣頁面上被清理出來的空閑空間就可以被再次使用了。

      但是每個頁面的空閑空間又不是固定大小的,所以如果要利用這些空間空間,就需要遍歷一遍數據頁面來找到它們,但是這樣會造成比較大的開銷。因此就設計了用來記錄每個頁面剩余空間的空閑空間映射表FSM(Free Space Mapping),以便高效的將空閑空間管理起來,方便查找和重新使用。

      實現過程

      數據膨脹了?又沒有空間了?一招教你解決

      FSM是以 _fsm 為后綴的文件對外展現的,每個行存表都有一個fsm文件。在表創建時,fsm文件并不會一起創建出來,而是在第一次vacuum時才會被創建。

      因為不同頁面上的元組長度各不相同,為了快速高效的管理空閑空間,沒必要非常精確的管理每一個字節。將一個8K的數據頁面(data block)分成256份,從頁面頭到頁面尾順序計算,排除頁面頭等固定支出,最多可以有255份空閑空間,這樣FSM用1個Byte就可以標識出一個數據頁面的空閑空間的大小。

      在空閑空間查詢時,我們只需要找到能滿足需求的頁面即可,所以FSM將每個頁的空余空間信息通過一個大根堆結構進行維護。這樣只需要從堆的根獲取當前最大的剩余空間就可以知道有沒有能符合要求的頁面。堆中的每個葉子節點都對應一個數據頁,葉子節點上記錄的是數據頁的可用單元的個數。

      然后FSM機制通過在不同的FSM頁間維護了一個類似FSM本身的樹形結構,來管理所有的FSM block:一個3層的多叉樹結構。

      FSM頁面也是大小為8K的塊(FSM block),所以每個FSM block最多可以描述4096個數據頁面(粗略計算,肯定是達不到的,因為有頁頭等信息)。按照3層計算:4096(0層)4096(1層)(8k*4096)(2層) = 2PB??梢怨芾?PB的數據,這對描述一張行存表,完全夠用了。

      整個FSM機制如下圖:

      level root和level medium都是用來查找level 2中的FSM頁面的

      level bottom是用來查找符合要求的heap頁面的

      FSM信息的可視化讀取

      FSM查找和維護的邏輯并不復雜,但是整個過程對外是不可見的。因此GaussDB(DWS)提供了pagehack工具來讀取FSM文件,幫助查看當前數據頁的空閑空間情況。

      下面結合pagehack工具解析FSM文件進一步理解FSM機制:

      首先新建行存表并插入大量數據。分布列數據固定,為了讓數據都落入一個dn,方便后面分析。

      刪掉 2 條位于第一個heap page的數據。因為是新建的表,所以數據會從前往后順序的落到數據頁面里,c2等于1和2的兩條數據一定在第一個頁面上。

      create table t1(c1 int, c2 int); -- 建行存表 insert into t1 values(15, generate_series(1,100000000)); -- 插入數據 delete from t1 where c2= 1 and c2=2; --刪掉 2 條位于第一個heap page的數據。

      vacuum t1; -- 生成FSM文件 checkpoint; -- 刷盤

      pagehack 解析FSM文件并輸出到文件中

      pagehack -t fsm -f 73916_fsm > 73916_fsm.log

      打開文件,從第一個fsm block開始看。第一個fsm block屬于 level root,看到一共111個fsm block,下層的最大空閑空間是31,且在數組0的位置上

      接著看到第二個fsm block,屬于level medium,記錄的最大空閑空間為31,數組0位置代表下層的fsm block 0有2個slot,數組108位置代表fsm block 108 有31個slot,其他都是0。0~108中間的0表示沒有這些頁面都沒有空閑空間了,108之后的表示頁面還沒有擴展出來

      再往后面是第三個fsm block,這個及以后的block都屬于level bottom,這層的FSM頁面都是直接對應數據頁面的??梢钥吹阶畲笫S嗫臻g為2,數組0位置代表heap page 0 有2個位置,正好是剛才刪除的兩條數據。

      第4個及后面的一直到110的block的信息如下,可以看到整個heap page都沒有剩余空間了,這是因為這些頁面一直在插入,沒有刪除數據。

      第111個block顯示,最大空閑空間為31。FSM總塊111個,塊號110,減去前面的兩個非葉子層的block,為108,正好對應前面第二個block中的第108個slot(存31)。

      從12553這行開始算,到12628的第26個位置為31,(12628-12553)40+26 = 3026。用page range算:439452+3026 = 442478。按 8k 頁面算: 4424788192 = ?3,624,779,776?;

      看一下實際文件大?。?073741824*3+403554304 = ?3,624,779,776?,與剛才算的結果相同。

      思考總結

      總結剛才的測試:

      我們一開始向空表順序插入了大量的數據,頁面也是順序的擴展

      在442478頁面的時候,最后的數據插入完畢,并且還留有31個空間可用

      當我們從第一個頁面刪除了兩條數據后,第一個頁面空余出了2個空間

      fsm樹的樣子類似:

      fsm block 0 (31,0,0...0) / fsm block 1 (2,0,0...0,31,0...0) / fsm block 2 fsm block 110 (2,0,0...0) (0,0...0,31,0...0)

      在level bottom這層的fsm block中,按順序存放的就是heap block的空閑空間值。

      1億條數據用了108個slot,而一個fsm block 有4000+個葉子,所以肯定是用不完的。

      對于日常運維的建議是:

      打開autovacuum,讓GaussDB(DWS)自動的幫你做vacuum,這樣新的數據就可以通過FSM機制復用空閑頁面,以減少數據膨脹帶來的磁盤空間浪費。

      想了解GuassDB(DWS)更多信息,歡迎微信搜索“GaussDB DWS”關注微信公眾號,和您分享最新最全的PB級數倉黑科技~

      EI企業智能 Gauss AP 數據倉庫服務 GaussDB(DWS)

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel表格中如何繪制斜線表頭?
      下一篇:如何在WPS表中快速搜索 如何使用模糊搜索和精確搜索(怎么在wps表格里快速搜索)
      相關文章
      亚洲另类少妇17p| 亚洲AV色欲色欲WWW| 亚洲精品国产福利一二区| 亚洲色欲色欲www在线播放| 亚洲精品国产日韩| 亚洲综合色区中文字幕| 久久精品国产亚洲AV忘忧草18| 亚洲精品国产免费| 亚洲导航深夜福利| 亚洲伦理一二三四| 国产精品久久亚洲不卡动漫| ass亚洲**毛茸茸pics| 亚洲三级在线免费观看| 99热亚洲色精品国产88| 亚洲一卡2卡三卡4卡无卡下载| 亚洲真人无码永久在线观看| 中文字幕无码精品亚洲资源网久久| 亚洲综合色婷婷在线观看| 亚洲自偷自偷在线成人网站传媒 | 久久久久亚洲精品中文字幕| 亚洲国产小视频精品久久久三级| 亚洲AV中文无码乱人伦| 亚洲一区二区精品视频| 亚洲一区二区三区香蕉| 亚洲av网址在线观看| 久久精品亚洲精品国产色婷 | 亚洲国产综合精品中文字幕 | 亚洲无mate20pro麻豆| 亚洲日本在线电影| 日产国产精品亚洲系列| 亚洲一本大道无码av天堂| 精品久久久久久亚洲| 久久久久亚洲AV无码麻豆| 亚洲an日韩专区在线| 亚洲欧美不卡高清在线| 亚洲国产精品成人一区| 亚洲精品午夜无码专区| 4480yy私人影院亚洲| 亚洲激情视频图片| 在线精品自拍亚洲第一区| 久久久久国产成人精品亚洲午夜|