varchar(n)
タイプに関して Postgres doc からこのフラグメントの意味を尋ねたかったのです。
短い文字列(最大126バイト)のストレージ要件は、1バイトに実際の文字列を加えたもので、文字の場合はスペースのパディングが含まれます。長い文字列は、1ではなく4バイトのオーバーヘッドを持ちます。
varchar(255)
フィールドがあるとします。そして今、次のステートメント:
上記の説明は正しいですか? ここ 誰かが私と同じようにドキュメントを理解していますが、ここでは誰かがオーバーヘッドは常に4バイトであると述べています ここ ?
当然のことながら、マニュアルは正しいです。しかし、それだけではありません。
1つは、サイズ on disk ( table 内、実際にディスクに保存されていない場合でも)は、サイズとは異なります in memory 。ディスクでは、マニュアルに記載されているように、126バイトまでの短いvarchar
値のオーバーヘッドは1バイトに削減されます。ただし、オーバーヘッドメモリ内は常に4バイト(個々の値が抽出されると)。
同じことが text
、varchar
、varchar(n)
またはchar(n)
にも当てはまります-char(n)
はn
文字まで空白で埋められており、通常は使用しません。 n
はバイト数ではなく最大文字数を示すため、マルチバイトエンコーディングでもその有効サイズは変わる可能性があります。
n
文字(バイトではない)までの文字列。
それらはすべて内部でvarlena
を使用します。
_"char"
_(二重引用符付き)は別の生き物であり、常に1バイトを占有します。
型なし文字列リテラル (_'foo'
_)には、1バイトのオーバーヘッドがあります。タイプされた値と混同しないでください!
pg_column_size()
でテストします。
_CREATE TEMP TABLE t (id int, v_small varchar, v_big varchar);
INSERT INTO t VALUES (1, 'foo', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');
SELECT pg_column_size(id) AS id
, pg_column_size(v_small) AS v_small
, pg_column_size(v_big) AS v_big
, pg_column_size(t) AS t
FROM t
UNION ALL -- 2nd row measuring values in RAM
SELECT pg_column_size(1)
, pg_column_size('foo'::varchar)
, pg_column_size('12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'::varchar)
, pg_column_size(ROW(1, 'foo'::varchar, '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'::varchar));
id | v_small | v_big | t
----+---------+-------+-----
4 | 4 | 144 | 176
4 | 7 | 144 | 176
_
ご覧のように:
integer
のストレージにはオーバーヘッドがありません(ただし、パディングを課す可能性があるアライメント要件があります)。varchar
のオーバーヘッドは、行から抽出されていない間も1バイトです。 (そのため、行全体を選択する方が少し速い場合があります。)関連: