PostgreSQL) 各列のバイト数に限らずタプルのバイト数がTOAST_TUPLE_THRESHOLD(2KB)を超えるとToastが使用されることを検証した

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のコンパイル時に可能