您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何用PG的pageinspect工具進行查看分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
如果使用MYSQL 相對頁面的層次進行一些了解,估計你就的找大佬們的工具集合,并且為此膜拜大佬們,但PG并不需要這樣,PG自身自帶的pageinspect 工具,就可以讓你對頁面級別的層次來進行一個 “透心涼” 的查看和分析,并不在為此苦惱。
首先確認您是否擁有了 pageinspect 這個 extension ,下圖通過查看pg_extension這個表您可以確認,當前您的PG上已經安裝了這個extension.
如果沒有請 create extension pageinspect;
執行這條預計在您當前的數據塊中,如果還不行,請您確認您的PG 安裝與編譯是否正常。
select * from heap_page_items(get_raw_page('test',0)) order by lp_off desc;
通過上面的的圖,是可以推理出數據存儲是從頁尾開始的,數據的插入順序與步進之間的關系。
SELECT * from page_header(get_raw_page('test', 0));
lower = 72 , 通過這里可以獲知當前PG的表TEST 中曾經有過多少tumple(在這一刻),PG的每頁有28bytes 的頁頭,同時每個指針是4bytes ,(72 - 28)/4 = 11 ,證明當前的指針有11個。
我們插入一條記錄
insert into test select generate_series(1,1), random()*100, random()*1, now();
從上圖可以看出,指針并未有變化,并通過查看數據和頁面的情況,看到新插入的記錄,使用了之前空出的 ctid (0,1) 位置,所以指針并不需要在重新分配。
我們繼續在插入兩條記錄,可以看出指針分配了4個字節,并且新的記錄也插入了未分配的空間,每行的偏移量是64bytes
我們刪除 ID > 5 的記錄
然后 vacuum test表
通過命令我們也可以看到 vacuum 后的空間回收了,并且頁頭也重新標記了次頁面的容量,但指針是不在回收了。
通過上面幾個簡單的命令就可以,理解一些枯燥乏味的PG 某些原理,也是不錯的體驗。
如果還不理解上面的意思可以看下面這個圖(由于信息量太大,所以只能截斷成兩個圖)
這兩張圖拼在一起,呈現的就是一個完整的頁面上面28個字節頭,+ 每個指針 下面就是你存儲的每行數據,所以在此證明了頁面存儲的方式和邏輯中間的0 都是未占用的空間。
我想到此也就沒有什么人不在不理解 PG的頁面了,試問還有那個數據庫在不通過第三方的插件或軟件的情況下,能如此通透的展現一個頁面在你面前。
SELECT get_raw_page::text FROM get_raw_page('test', 0);
相關的頁面獲得的源代碼,將頁面的內容memcpy到buffer 然后給大家展現出來。
那如果有人問,你的數據到底占用了多少個頁面,我看看看怎么來通過某種方式來回答他。
1 一個頁面我有多少數據
2 一共有多少行數據
2 /1 約等于 多少頁面
我們看看上面的算法是不是可以應用到PG 中
從結果看,還是比較準確的。
上述就是小編為大家分享的如何用PG的pageinspect工具進行查看分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。