PostgreSQL 資料頁Page解析(1)- 基礎
本文簡單介紹了PG資料表的儲存基礎知識以及可用於解析資料頁Page內容的pageinspcet外掛。
一、PG資料表儲存基礎
一般來說,資料表資料物理儲存在非易失性儲存裝置上面,PG也不例外。如下圖所示,資料表中的資料儲存在N個資料檔案中,每個資料檔案有N個Page(大小預設為8K,可在編譯安裝時指定)組成。Page為PG的最小存取單元。
普通資料表儲存結構
資料頁(Page)
資料頁Page由頁頭、資料指標陣列(ItemIdData)、可使用的空閒空間(Free Space)、實際資料(Items)和特殊空間(Special Space)組成。
A、頁頭儲存LSN號、校驗位等後設資料資訊,佔用24Bytes
B、資料指標陣列儲存指向實際資料的指標,陣列中的元素ItemId可理解為相應資料行在Page中的實際開始偏移,資料行指標ItemID由三部分組成,前15位為Page內偏移,中間2位為標誌,後面15位為長度,詳細解析可參見附錄
C、空閒空間為未使用可分配的空間,ItemID從空閒空間的頭部開始分配,Item(資料行)從空閒空間的尾部開始
D、實際資料為資料的行資料(每種資料型別的儲存格式後續再解析)
E、特殊空間用於儲存索引訪問使用的資料,不同的訪問方法資料不同
二、pageinspect外掛
如何簡單快速方便的檢視Page中的內容?不同於Oracle各種dump,在PG中可以方便的使用pageinspect外掛提供的各種函式檢視Page中的內容。
安裝
得益於PG良好的擴充套件性,安裝很簡單:
#cd $PGSRC/contrib/pageinspect
#make
#make install
簡單使用
#psql -d testdb
testdb#create extension pageinspect; -- 首次使用需建立Extension
-- 建立測試表
drop table if exists t_new;
create table t_new (id char(4),c1 varchar(20));
insert into t_new values('1','#');
-- 檢視page header&item
SELECT * FROM page_header(get_raw_page('t_new', 0));
select * from heap_page_items(get_raw_page('t_new',0));
Page Header&Item
-- 檢視Page中的raw內容
\x
select * from get_raw_page('t_new', 0);
Page頭部內容
Page尾部內容
pageinspect的實現,可以檢視pageinspect的原始碼,更深入的理解可以通過直接分析Page中的資料內容進行理解,這部分內容在下一節再行介紹。
參考文件:
https://www.postgresql.org/docs/11/static/storage-page-layout.html
https://www.postgresql.org/docs/11/static/pageinspect.html
附:相關資料結構
標頭檔案:src/include/storage/bufpage.h
typedef struct PageHeaderData
{
/* XXX LSN is member of *any* block, not only page-organized ones */
PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog
* record for last change to this page */
uint16 pd_checksum; /* checksum */
uint16 pd_flags; /* flag bits, see below */
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
} PageHeaderData;
typedef PageHeaderData *PageHeader;
標頭檔案:src/include/storage/itemid.h
/*
* An item pointer (also called line pointer) on a buffer page
*
* In some cases an item pointer is "in use" but does not have any associated
* storage on the page. By convention, lp_len == 0 in every item pointer
* that does not have storage, independently of its lp_flags state.
*/
typedefstruct ItemIdData
{
unsigned lp_off :15,/* offset to tuple (from start of page) */
lp_flags :2,/* state of item pointer, see below */
lp_len :15;/* byte length of tuple */
} ItemIdData ;
typedef ItemIdData * ItemId ;
/*
* lp_flags has these possible states. An UNUSED line pointer is available
* for immediate re-use, the other states are not.
*/
#define LP_UNUSED 0 /* unused (should always have lp_len=0) */
#define LP_NORMAL 1 /* used (should always have lp_len>0) */
#define LP_REDIRECT 2 /* HOT redirect (should have lp_len=0) */
#define LP_DEAD 3 /* dead, may or may not have storage */
/*
* Item offsets and lengths are represented by these types when
* they're not actually stored in an ItemIdData.
*/
typedef uint16 ItemOffset ;
typedef uint16 ItemLength ;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2158302/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL Page頁結構解析(1)-基礎SQL
- PostgreSQL Page頁結構解析(3)- 行資料SQL
- PostgreSQL 資料頁Page解析(2)- 頁頭和行資料指標SQL指標
- PostgreSQL Page頁結構解析(2)- 頁頭和行資料指標SQL指標
- PostgreSQL Page頁結構解析(5)- B-Tree索引儲存結構#1SQL索引
- PostgreSQL Page頁結構解析(4)- 執行DML時表佔用空間解析SQL
- PostgreSQL Page頁結構解析(6)- B-Tree索引儲存結構#2SQL索引
- PostgreSQL Page頁結構解析(7)- B-Tree索引儲存結構#3SQL索引
- 帝國CMS動態頁分頁函式page1解析說明函式
- 搭建基礎架構-Page架構
- PostgreSQL基礎SQL
- 小白系列:資料庫基礎知識解析資料庫
- 大資料入門:Hadoop Yarn元件基礎解析大資料HadoopYarn元件
- JS基礎總結(1)——資料型別JS資料型別
- 解析postgresql 刪除重複資料案例SQL
- PostgreSQL 原始碼解讀(1)- 插入資料#1SQL原始碼
- PostgreSQL如何檢視page、index的詳細資訊SQLIndex
- 1. PostgreSQL 資料庫安裝SQL資料庫
- Andorid SQLite資料庫開發基礎教程(1)SQLite資料庫
- day 2 數學基礎 &資料結構1資料結構
- GaussDB資料庫基礎函式介紹1資料庫函式
- PostgreSQL xlog格式之no backup full pageSQL
- PostgreSQL xlog格式之backup full pageSQL
- MySQL:Innodb page clean 執行緒 (一) 基礎MySql執行緒
- PostgreSQL DBA(1) - 資料庫引數設定#1SQL資料庫
- java web 之 網頁前端開發基礎(1)JavaWeb網頁前端
- Java基礎擴充套件1.資料輸入Java套件
- 資料結構與演算法(1)- 基礎概念資料結構演算法
- python-資料分析-NumPy的應用-1、基礎Python
- 大資料專欄 - 基礎1 Hadoop安裝配置大資料Hadoop
- SQL Server資料庫怎麼找出一個表包含的頁資訊(Page)SQLServer資料庫
- Flutter 基礎(十二)路由(頁面跳轉)與資料傳遞Flutter路由
- Flutter基礎(十二)路由(頁面跳轉)與資料傳遞Flutter路由
- Flutter基礎(十一)網路請求(Dio)與JSON資料解析FlutterJSON
- Flutter 基礎(十一)網路請求(Dio)與 JSON 資料解析FlutterJSON
- PG技術大講堂 - 第13講:PostgreSQL Full-Page Writes 全頁寫SQL
- 資料庫基礎資料庫
- 資料庫 基礎資料庫