2. プロセスとメモリー
3.1 ファイルシステムの構造
3.1.3 TOAST 機能
通常PostgreSQLは8 KB単位のページにレコードを格納します。レコードがページをま
$ 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
たがって格納されることはありません。このため大規模なレコードはページに含めること ができません。より大規模なレコードを格納するためにTOAST (The Oversized-Attribute
Storage Technique)と呼ばれる機能が提供されています。TOASTデータは圧縮済の列デー
タがTOAST_TUPLE_THRESHOLD(コンパイル時に決定)で決められたサイズを超える
場合に作成されます。またTOAST_TUPLE_TARGET以下に縮小されるまでTOASTテー ブルにデータを格納します。
□ TOASTテーブル
TOASTデータはpg_classビューのrelfilenode列で指定されるファイルとは別テーブル
(別ファイル)に格納されます。pg_class ビューのreltoastrelid 列には、TOAST テーブ ルのoidが保存されます。pg_classビューからTOASTテーブルのファイル名(relfilenode)
および TOAST インデックスのファイル名(reltoastidxnode)を検索することで、ファイ
ルを特定することができます。TOAST テーブルはpg_tablesビューやpg_indexesビュー には表示されません。
図3はテーブルとTOASTテーブル、TOASTインデックスの関係を表しています。テー
ブルtoast1を作成しすると、TOASTテーブルtoast_16525が自動的に作成され、ファイ
ル16532に保存されます。TOASTインデックスは16530ファイルに格納されます。
図 3 pg_classビューとTOASTテーブル
□ TOASTデータの保存
TOASTデータには保存フォーマットを指定することができます。保存フォーマットは通
常自動的に決定されますが、列単位で指定することができます。
oid relname relfilenode reltoastrelid reltoastidxrelid
16525 toast1 16531 16528 0
16528 toast_16525 16532 0 16530
表 24 TOASTデータ保存フォーマット フォーマット 説明
PLAIN TOASTを使用しません。
EXTENDED 圧縮とTOASTテーブルを利用します。多くのTOASTを利用できる
データ型のデフォルト値です。
EXTERNAL 圧縮は行いませんが、TOASTテーブルを利用します。
MAIN 圧縮は行いますが、TOASTテーブルは原則として使用しません。
psqlコマンド内から、「¥d+ テーブル名」を実行すると、TOAST対応列の保存フォーマ ットを確認できます。次の例では、toast1 テーブルのc1 列(varchar型)と c2 列(text
型)がTOAST対応であることがわかります。
例 18 TOAST列の確認
デ フ ォ ル ト の 保 存 フ ォ ー マ ッ ト を 変 更 す る た め に は ALTER TABLE 文 で SET
STORAGE句を使って指定します。
postgres=> \d+ toast1
Table "public.toast1"
Column | Type | Modifiers | Storage | Stats target | Description ---+---+---+---+---+--- c1 | numeric | | main | |
c2 | character varying(10) | | extended | | c3 | text | | extended | | Has OIDs: no
例 19 TOAST保存フォーマットの変更