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中的raw內容
\x
select * from get_raw_page('t_new', 0);
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
{
unsignedlp_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;
typedefItemIdData*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.
*/
typedefuint16ItemOffset;
typedefuint16ItemLength;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374923/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL 資料頁Page解析(1)- 基礎SQL
- PostgreSQL Page頁結構解析(5)- B-Tree索引儲存結構#1SQL索引
- PostgreSQL Page頁結構解析(3)- 行資料SQL
- PostgreSQL Page頁結構解析(6)- B-Tree索引儲存結構#2SQL索引
- PostgreSQL Page頁結構解析(7)- B-Tree索引儲存結構#3SQL索引
- PostgreSQL Page頁結構解析(2)- 頁頭和行資料指標SQL指標
- PostgreSQL Page頁結構解析(4)- 執行DML時表佔用空間解析SQL
- PostgreSQL儲存引擎之page結構SQL儲存引擎
- 搭建基礎架構-Page架構
- 如何從零學習PostgreSQL Page結構SQL
- PostgreSQL 資料頁Page解析(2)- 頁頭和行資料指標SQL指標
- 帝國CMS動態頁分頁函式page1解析說明函式
- day 2 數學基礎 &資料結構1資料結構
- Elasticsearch基礎結構Elasticsearch
- PostgreSQL基礎SQL
- PE檔案結構解析1
- 資料結構與演算法(1)- 基礎概念資料結構演算法
- jmeter基礎之目錄結構解析及配置檔案修改JMeter
- Redis基礎知識(學習筆記1--五種基礎資料結構)Redis筆記資料結構
- ES 架構及基礎 - 1架構
- PostgreSQL:物理結構SQL
- PostgreSQL:程式結構SQL
- NODE基礎總結(1) —— EventloopOOP
- Redis基礎資料結構Redis資料結構
- Kotlin 基礎-程式結構(上)Kotlin
- 5.MySQL 基礎結構MySql
- 資料結構基礎 連結串列資料結構
- 淺入ABP(1):搭建基礎結構的 ABP 解決方案
- Redis基礎——剖析基礎資料結構及其用法Redis資料結構
- 15_解析Oracle os header結構(1)OracleHeader
- 我的html基礎總結—1HTML
- JS基礎知識總結(1)JS
- Java基礎知識總結-1Java
- PostgreSQL:邏輯結構SQL
- PostgreSQL 目錄結構SQL
- openstack基礎構架以及服務方式解析
- 基礎資料結構大賞資料結構
- c++基礎十(流程結構)C++