Şaşırtıcı olmayan bir şekilde, kılavuz doğru. Ama daha fazlası var.
Birincisi, diskteki boyut (herhangi bir tabloda , gerçekte diskte saklanmamış olsa bile) bellekteki boyuttan farklı olabilir . Diskte, varchar
126 bayta kadar kısa değerler için ek yük , kılavuzda belirtildiği gibi 1 bayta indirgenir . Ancak bellekteki ek yük her zaman 4 bayttır (tek tek değerler çıkarıldığında).
Aynı şey , veya için de geçerlidir text
,varchar
varchar(n)
char(n)
ancak bu karakterlere char(n)
boş olarak doldurulur n
ve normalde kullanmak istemezsiniz. Etkili boyutu çok baytlı kodlamalarda değişebilir, çünkü n
bayt değil, maksimum karakter anlamına gelir:
n
karakter (bayt değil) uzunluğuna kadar dizeler .
Hepsi varlena
dahili olarak kullanır .
"char"
(çift tırnak ile) farklı bir yaratıktır ve her zaman tek bir bayt kaplar.
Türlenmemiş dize değişmezlerinin ( 'foo'
) tek bir bayt ek yükü vardır. Yazılan değerlerle karıştırılmamalıdır!
İle test edin 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
Gördüğün gibi:
- 3 baytlık 'foo' dizgisinde 4 bayt ve RAM'de 7 bayt yer kaplar (yani 1 bayt ve 4 bayt ek yük).
- 140 bayt '123 ...' dizesi hem diskte hem de RAM'de 144 bayt kaplar (bu nedenle her zaman 4 bayt ek yük).
- Depolama
integer
biriminin ek yükü yoktur (ancak dolgu uygulayabilecek hizalama gereksinimleri vardır).
- Satırın, üstbilgi başlığı için ek 24 bayt ek yükü vardır (ayrıca sayfa üstbilgisindeki öğe işaretçisi için her kanal için ek 4 bayt).
- Ve son fakat en az değil: Küçük
varchar
boyutun tepesi, satırdan çıkarılmadığı halde hala sadece 1 bayttır - satır boyutundan görülebileceği gibi. (Bu yüzden bazen tüm satırları seçmek biraz daha hızlıdır.)
İlişkili: