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