2. プロセスとメモリー
3.1 ファイルシステムの構造
3.1.2 データベース・ディレクトリの内部
データベースに対応するディレクトリ以下には、データベースに保存されるオブジェク トが個別のファイルとして作成されます。以下のファイルが自動的に作成されます。
表 26 データベース・ディレクトリ以下に作成されるファイル ファイル名 説明
{999999} セグメント・ファイル
{999999}.{9} セグメント・ファイル(1 GB超の場合)
{999999}_fsm Free Space Mapファイル {999999}_vm Visibility Mapファイル
{999999}_init4 UNLOGGED TABLEの初期化フォークを示すファイル
pg_filenode.map 一部のシステム・カタログのOIDと物理ファイル名のマッピングを
行う。
pg_internal.init システム情報のキャッシュファイル。インスタンス起動時に再作成
される。
{PGDATA}/global ディレクトリおよびデータベースが保存される
ディレクトリ直下に作成される。
PG_VERSION バージョン情報が記録されるテキストファイル。データベース利用
時にチェックされる。
□ テーブルの構成要素とカタログ
PostgreSQLのテーブルは、実際には複数のオブジェクトの集合体です。内部的には以下
の要素から構成されています。
4 _init フ ァイルは UNLOGGED TABLE、UNLOGGED TABLE の TOAST テ ーブル 、
UNLOGGED TABLEのTOASTインデックス、UNLOGGED TABLEに対して作成されたイ
ンデックスに対して作成されます。
表 27 テーブルを構成する要素
要素 説明 備考
テーブル データが保存される領域
インデックス 検索高速化のためにテーブルに作成される索引
TOASTテーブル 大規模データを格納する領域 後述
TOASTインデックス TOASTテーブルの検索を高速化するインデックス 後述
上記の要素をすべて管理するカタログがpg_classです。pg_classカタログにはテーブル 名(relname)、TOASTテーブルやTOASTインデックスのOID(reltoastrelid)が格納さ れています。pg_tables カタログは pg_class カタログからテーブルのみを抽出するビュー になっています。テーブルとインデックスの対応付けを行うカタログがpg_indexです。こ のカタログにはpg_classカタログに格納されているテーブルのOID(indexrelid)と、イ ンデックスのOID(indrelid)等の情報が格納されています。
図 4 テーブルとカタログ
□ テーブルとファイルの関係
テーブルやインデックスとオペレーティング・システムのファイルはpg_classカタログ
のrelfilenode列の値と対応しています。
オブジェクトとファイルの関係は oid2name ユーティリティを使っても確認できます。
格納されるテーブル空間は pg_class カタログのreltablespace 列で確認します。この列値 が0の場合、pg_defaultテーブル空間であることを示します。
テーブル pg_tables
テーブル インデックス
TOASTテーブル
TOASTインデックス
pg_class
インデックス
TOASTインデックス
pg_index
例 26 ファイルの特定
□ セグメント・ファイル
セグメント・ファイルは、テーブルやインデックスの実データが格納されたファイルです。
ファイル・サイズが1 GB (RELSEG_SIZE×BLCKSZ) を超えると複数作成されます。元 のファイルに加えて、ファイル名の末尾に「.{9} ({9}は1から始まる数字)」付のファイル が作成されます。
例 27 セグメント・ファイル
$ oid2name –d datadb1 From database "datadb1":
Filenode Table Name --- 16437 data1
postgres=> SELECT relname, relfilenode, reltablespace FROM pg_class WHERE relname IN ('data2', 'data3') ;
relname | relfilenode | reltablespace ---+---+---
data2 | 34115 | 0 <- テーブル空間 pg_default data3 | 34119 | 32778 <- テーブル空間 tbl2
postgres=> SELECT oid, relname, relfilenode FROM pg_class WHERE relname='large1' ;
oid | relname | relfilenode ---+---+--- 16468 | large1 | 16495 (1 row)
$ ls -l 16495*
-rw---. 1 postgres postgres 1073741824 Feb 11 14:06 16495 -rw---. 1 postgres postgres 96550912 Feb 11 14:06 16495.1
□ インデックス・ファイル
テーブルと同様にインデックスも独立したファイルとして作成されます。インデックス のファイル名もpg_classカタログのrelfilenode列に格納されています。テーブルとインデ ックスを結びつけるカタログがpg_indexです。
図 5 pg_classカタログとインデックス