• 検索結果がありません。

TOAST 機能

ドキュメント内 PostgreSQL Internals(1) (ページ 42-45)

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保存フォーマットの変更

ドキュメント内 PostgreSQL Internals(1) (ページ 42-45)