당연히 매뉴얼이 옳습니다. 그러나 더 많은 것이 있습니다.
하나의 경우, 디스크의 크기 ( 실제로 디스크에 저장되지 않은 경우에도 모든 테이블 에서)는 메모리의 크기 와 다를 수 있습니다 . 디스크 에서 매뉴얼에 명시된대로 varchar
최대 126 바이트의 짧은 값에 대한 오버 헤드 가 1 바이트 로 줄어 듭니다 . 그러나 메모리 의 오버 헤드 는 항상 4 바이트입니다 (한 번 개별 값이 추출 됨).
동일은 마찬가지입니다 text
, varchar
, varchar(n)
또는char(n)
-이 제외 char(n)
되는 빈 - 패딩 n
문자와 일반적으로 사용하지 않습니다. 유효 크기는 바이트가 n
아니라 최대 문자를 나타내 므로 멀티 바이트 인코딩에서 여전히 다를 수 있습니다 .
최대 n
길이의 문자 (바이트가 아님)
그들 모두는 varlena
내부적으로 사용 합니다.
"char"
(큰 따옴표 포함)는 다른 생물이며 항상 단일 바이트를 차지합니다.
형식화되지 않은 문자열 리터럴 ( 'foo'
)에는 단일 바이트 오버 헤드가 있습니다. 입력 된 값과 혼동하지 마십시오!
로 테스트하십시오 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
보다시피 :
- 3 바이트 스트링 '갑'은 점유 4 바이트 디스크 및 7 바이트 RAM (오버 헤드이므로 1 바이트 대 4 바이트)에있다.
- 140 바이트 문자열 '123 ...'은 디스크와 RAM 모두에서 144 바이트를 차지하므로 항상 4 바이트의 오버 헤드가 발생합니다.
- 스토리지
integer
에는 오버 헤드가 없지만 패딩이 발생할 수있는 정렬 요구 사항이 있습니다.
- 행은 튜플 헤더에 대한 추가 오버 헤드가 24 바이트이며 페이지 헤더의 항목 포인터에 대해 튜플 당 추가 4 바이트가 있습니다.
- 그리고 마지막으로 :
varchar
행 크기에서 볼 수 있듯이 작은 행의 오버 헤드 는 여전히 1 바이트이지만 행에서 추출되지 않았습니다. (따라서 때로는 전체 행을 선택하는 것이 조금 더 빠릅니다.)
관련 :