PLAIN p 値は必ずそのまま格納される。固定長の型はだいたいこれ。 ダメならエラーでいいや。諦めのいい奴。 MAIN m まず、値を圧縮して格納しようと試みる。 例外的に圧縮しても格納できなければ TOAST テーブルに格納する。 EXTERNAL e 格納できなかったら TOAST テーブルに非圧縮で格納する。 EXTENDED x まず、値を圧縮して格納しようと試みる。圧縮が有効そうでなければ、 TOAST テーブルに格納する。
int, dummy char(7500), data text ); ALTER TABLE test ALTER COLUMN dummy SET STORAGE plain; ALTER TABLE test ALTER COLUMN data SET STORAGE XXXX; INSERT INTO test VALUES (1, '', repeat(generate_random_numeric_text(512), 2) ) ; INSERT INTO test VALUES (2, '', repeat(generate_random_numeric_text(1024), 1) ) ; SELECT relname, reltype, relfilenode, reltoastrelid FROM pg_class WHERE relname = 'test'; CHECKPOINT; XXXX に以下の値を設定。 plain, main, external, extended
int, data1 text, data2 text, data3 text, data4 text ); ALTER TABLE test ALTER COLUMN data1 SET STORAGE extended; ALTER TABLE test ALTER COLUMN data2 SET STORAGE extended; ALTER TABLE test ALTER COLUMN data3 SET STORAGE extended; ALTER TABLE test ALTER COLUMN data4 SET STORAGE extended; \timing INSERT INTO test VALUES (generate_series(1, 2500), '0001_' || repeat(generate_random_numeric_text(500), 5), '0002_' || repeat(generate_random_numeric_text(500), 5), '0003_' || repeat(generate_random_numeric_text(500), 5), '0004_' || repeat(generate_random_numeric_text(500), 5) ); EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM test; 実際には 5 回測定、 2 回目以降の 4 回分の平均を取得 任意の長さの数字文字列を 生成する自作 SQL 関数 plain/main/ extended/external を 設定して違いを見てみる。