TL;DR
- タプルのバイト数がTOAST_TUPLE_THRESHOLD(通常2KB)を超えるとToastが使用されることを検証した
- 各列の合計バイト数が2KBを超える場合が閾値でToastが使用される
きっかけ
PostgreSQLでは行連鎖/行移行は非サポートで、1行のサイズが2KBを超えるとToastテーブルに格納される。列が複数ある場合、1つの列は2KB以下で列合計で2KBを超える場合もToastが使用されるのか知りたくなった
検証方法
1カラムのテーブルでの検証
- t1テーブル(c1列 text型)を作成
- 各タプルに何バイト突っ込んだらToastが使用されるか、バイト数を変えて試した
- 結果、1つのカラムでは、2005バイト以上でToastに格納された
- 2004バイト以下ではToast未使用
2カラムのテーブルでの検証
- t2テーブル(c1列 text型, c2列 text型)を作成
- 両方の列に同じ値を入れた場合、1001バイト以上でToastに格納された
- 各列のバイト数が1000バイト以下ではToast未使用
- 各列の合計バイト数(タプル単位)では2002でToast使用
- c1列を0バイトで固定、c2列にデータを入れる場合、c2列が2001バイト以上でToastに格納された
- c2列が2000バイト以下ではToast未使用
- 各列の合計バイト数(タプル単位)では2001でToast使用
検証環境
- Aurora PostgreSQL 15.3
- パラメータはデフォルト
- 検証用に投入したデータは、英大文字と数字のランダム文字列
- F5YQXXPRFTFDRRGFW4JLG9PG00VBF90NC7…
備考
TOAST_TUPLE_THRESHOLD: 2KBはPostgreSQL上で確認できるパラメータとしては存在せず、変更はPostgreSQLのコンパイル時に可能