17. Storage 格納戦略 (2)
● 検証用スクリプト
CREATE TABLE test (
id 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
20. EXTENDED vs EXTERNAL
● TEXT 型や bytea 型のような長大なデータが格納されるデータ型
の Storage 格納戦略としては EXTENDED がデフォルトの格納戦
略となる。
● ALTER TABLE で格納戦略を EXTERNAL 等に変更することもでき
る。
● EXTENDED を EXTERNAL に変更して嬉しいケースはあるのか?
21. EXTENDED vs EXTERNAL
● 測定モデル(圧縮が効くケース)
CREATE TABLE test (
id 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 を
設定して違いを見てみる。