Tính toán của bạn bị sai ở một số điểm.
- Kích thước bộ nhớ của
varchar
,text
(vàcharacter
!) là, trích dẫn hướng dẫn sử dụng ):
Nhấn mạnh đậm của tôi để giải quyết câu hỏi trong nhận xét.
-
HeapTupleHeader chiếm 23 byte . Nhưng mỗi bộ ("item" - mục nhập hàng hoặc chỉ mục) có một số nhận dạng mặt hàng ở đầu trang dữ liệu, tổng cộng là 27 byte được đề cập. Sự khác biệt có liên quan vì dữ liệu người dùng thực tế bắt đầu bằng bội số của
MAXALIGN
từ đầu mỗi mặt hàng và số nhận dạng mặt hàng không tính vào khoảng chênh lệch này - cũng như "kích thước tuple" thực tế. -
1 byte đệm do căn chỉnh dữ liệu (bội số của 8), được sử dụng cho bitmap NULL trong trường hợp này.
-
Không có phần đệm cho loại
varchar
(nhưng byte bổ sung được đề cập ở trên)
Vì vậy, phép tính thực tế (với tất cả các cột được lấp đầy đến mức tối đa) là:
23 -- heaptupleheader
+ 1 -- NULL bitmap (or padding if row has NO null values)
+ 9 -- columns ...
+ 101
+ 2
+ 101
+ 4
+ 11
-------------
252 bytes
+ 4 -- item identifier at page start
Có liên quan:
- Không sử dụng NULL trong PostgreSQL vẫn sử dụng bitmap NULL trong tiêu đề?
- Tính toán và tiết kiệm dung lượng trong PostgreSQL
Bạn sẽ tìm thấy nhiều thứ khác trong danh sách liên kết ở bên phải của những câu trả lời này.