GaussDB查詢表空間大小語句及原理
GaussDB查詢表空間大小
-- 查詢版本
select version(); -- GuassDB_T_1.2.1.SPC135.B002Release b7197fd195
-- 單個Segment的物理占用字節數
select * from MY_SEGMENTS;
-- 一張表的總字節大小=該表所有Segment的BYTES之和
select
segment_name as 表名,
sum(bytes) as 總字節數, -- 匯總所有DN上的Segment大小
sum(bytes)/1024/1024 as 總大小_MB -- 轉換為MB更易讀
from MY_SEGMENTS
where
segment_type = 'TABLE' -- 只保留表類型的Segment
-- and segment_name = 'USER_INFO' -- 指定表名(大寫,GuassDB默認區分大小寫)
-- and owner = 'USER1' -- 可選:過濾表所有者,避免歧義
group by segment_name;
一、基礎前提:GuassDB 的 MPP 架構與數據分段(Segment)
GuassDB 是典型的MPP(大規模并行處理)數據庫,其核心設計是將數據 “分片存儲、并行計算”—— 這是理解MY_SEGMENTS作用的關鍵:
- 數據節點(DN):GuassDB 集群包含多個 DN(Data Node),每個 DN 是獨立的存儲和計算單元;
- 數據分段(Segment):當創建一張表時,GuassDB 會根據預設的 “分片策略”(如哈希分片、范圍分片),將表的完整數據拆分成多個邏輯分片,每個分片對應一個「Segment」,并分配到不同的 DN 上存儲;
- Segment 的物理載體:每個 Segment 本質是 DN 上的一組物理數據文件(包含數據塊、索引塊、管理塊等),表的實際數據就分散存儲在這些 Segment 的物理文件中。
簡單說:一張表的完整數據 = 多個 DN 上的 Segment 數據之和,表的 “字節大小” 本質是所有 Segment 物理占用空間的總和。
二、核心角色:MY_SEGMENTS 是 “Segment 元數據的系統字典表”
MY_SEGMENTS 是 GuassDB 內置的系統表(數據字典表),專門用于存儲集群中所有「Segment」的元數據信息 —— 包括 Segment 對應的對象(表、索引等)、存儲位置、物理大小等關鍵屬性。
可以把它理解為 GuassDB 的 “Segment 資產臺賬”:每一個 Segment 在創建、修改、刪除時,系統都會自動更新這張表的記錄,確保元數據與實際存儲狀態一致。
三、關鍵機制:MY_SEGMENTS 如何記錄 “字節大小”?
MY_SEGMENTS 能查詢到表的字節大小,核心是它通過實時維護 Segment 的物理存儲元數據實現的,具體分為 3 個步驟:
1. Segment 創建時:初始化元數據
當用戶執行 CREATE TABLE 創建表時:
- GuassDB 根據分片策略在多個 DN 上創建對應數量的 Segment(如 3 個 DN 則可能創建 3 個 Segment);
- 系統自動在 MY_SEGMENTS 中插入一條 / 多條記錄(每個 Segment 對應一條),并初始化關鍵字段:
SEGMENT_NAME:對應表名(或索引名,區分 Segment 類型);SEGMENT_TYPE:標記 Segment 類型(TABLE表示表段、INDEX表示索引段、TEMPORARY表示臨時段等);BYTES:初始化為 0(此時無數據,物理占用為 0);BLOCKS:初始化為 0(Segment 占用的數據塊數量,與BYTES關聯:BYTES = BLOCKS * 數據塊大小,GuassDB 默認數據塊為 8KB);TABLESPACE_NAME:標記 Segment 所在的表空間(確定物理存儲路徑)。
2. 數據操作時:實時更新字節大小
當用戶執行 INSERT/DELETE/UPDATE 等數據操作,或 ALTER TABLE 等結構調整時:
-
數據寫入 / 刪除會直接修改 DN 上 Segment 對應的物理數據文件(如新增數據塊、釋放空塊);
-
GuassDB 的存儲引擎會實時計算該 Segment 物理文件的最新占用大小,并同步更新 MY_SEGMENTS
中對應記錄的 BYTES 和 BLOCKS 字段:
-
例如:插入 1000 行數據,占用 2 個 8KB 數據塊,則
BLOCKS=2,BYTES=2*8192=16384(字節); -
例如:刪除部分數據后,若釋放了空數據塊,
BLOCKS會減少,BYTES也會同步降低(注:部分場景下空塊可能暫不釋放,需手動執行VACUUM清理,此時BYTES可能暫時不變)。
-
3. 統計信息校準:確保大小準確性
除了實時更新,GuassDB 還會通過兩種方式校準 MY_SEGMENTS 的元數據準確性:
- 自動統計(Auto ANALYZE):系統定期(默認配置)執行
ANALYZE操作,掃描各 Segment 的物理文件,核對并修正BYTES、BLOCKS等字段,避免因碎片、臨時塊等導致的大小偏差; - 手動統計(Manual ANALYZE):用戶可執行
ANALYZE 表名手動觸發統計,適用于數據量劇變后需要即時獲取準確大小的場景。
四、查詢邏輯:如何從 MY_SEGMENTS 讀取表的字節大?。?/h3>
MY_SEGMENTS 中的 BYTES 字段直接存儲了單個 Segment 的物理占用字節數,而一張表的總字節大小 = 該表所有 Segment 的 BYTES 之和。
1. MY_SEGMENTS 核心字段說明(與 “字節大小” 相關)
| 字段名 | 含義說明 |
|---|---|
SEGMENT_NAME |
Segment 對應的對象名(如 “USER_INFO” 表名、“IDX_USER_INFO” 索引名) |
SEGMENT_TYPE |
Segment 類型(必須過濾為TABLE才是表的 Segment,排除索引 / 臨時段等干擾) |
BYTES |
單個 Segment 的物理占用字節數(核心字段,直接對應 “字節大小”) |
BLOCKS |
Segment 占用的數據塊數量(輔助驗證:BYTES ≈ BLOCKS * 數據塊大小,默認 8KB) |
TABLESPACE_NAME |
Segment 所在表空間(可定位物理存儲路徑) |
OWNER |
Segment 的所有者(避免查詢其他用戶的表) |
2. 實際查詢表字節大小的正確邏輯
直接 select * from MY_SEGMENTS 會返回所有類型 Segment(表、索引、臨時段等)的信息,需過濾 “表類型” 并匯總大小,例如:
-- 查詢指定表(如USER_INFO)的總字節大小
select
segment_name as 表名,
sum(bytes) as 總字節數, -- 匯總所有DN上的Segment大小
sum(bytes)/1024/1024 as 總大小_MB -- 轉換為MB更易讀
from MY_SEGMENTS
where
segment_type = 'TABLE' -- 只保留表類型的Segment
and segment_name = 'USER_INFO' -- 指定表名(大寫,GuassDB默認區分大小寫)
and owner = 'USER1' -- 可選:過濾表所有者,避免歧義
group by segment_name;
補充:
GuassDB_T_1.2.1.SPC135.B002是企業版(T 代表企業版),MY_SEGMENTS的核心字段(BYTES、SEGMENT_TYPE)在 GuassDB 各版本中基本一致,原理通用
浙公網安備 33010602011771號