Việc tính toán kích thước hàng phức tạp hơn nhiều.
Bộ nhớ thường được phân vùng trong 8 kB trang dữ liệu . Có một chi phí cố định nhỏ trên mỗi trang, các phần còn lại có thể không đủ lớn để phù hợp với một bộ khác và quan trọng hơn là các hàng chết hoặc tỷ lệ phần trăm được đặt trước ban đầu với FILLFACTOR
cài đặt.
Và thậm chí còn có nhiều chi phí hơn mỗi hàng (tuple):mã định danh mục 4 byte ở đầu trang, HeapTupleHeader
23 byte và đệm căn chỉnh . Phần đầu của tiêu đề tuple cũng như phần đầu của dữ liệu tuple được căn chỉnh theo nhiều MAXALIGN
, là 8 byte trên một máy 64 bit điển hình. Một số kiểu dữ liệu yêu cầu căn chỉnh với bội số tiếp theo của 2, 4 hoặc 8 byte.
Trích dẫn hướng dẫn sử dụng trên bảng hệ thống pg_tpye
:
typalign
là căn chỉnh bắt buộc khi lưu trữ một giá trị kiểu này. Nó áp dụng cho việc lưu trữ trên đĩa cũng như hầu hết các biểu diễn của giá trị bên trong PostgreSQL. Khi nhiều giá trị được lưu trữ liên tục, chẳng hạn như trong biểu diễn của một hàng hoàn chỉnh ondisk, phần đệm được chèn trước một số liệu thuộc loại này để nó bắt đầu trên ranh giới đã chỉ định. Tham chiếu căn chỉnh là sự bắt đầu của dữ liệu đầu tiên trong chuỗi.Giá trị có thể là:
c
=char
căn chỉnh, tức là không cần căn chỉnh.
s
=short
căn chỉnh (2 byte trên hầu hết các máy).
i
=int
căn chỉnh (4 byte trên hầu hết các máy).
d
=double
căn chỉnh (8 byte trên nhiều máy, nhưng không có nghĩa là tất cả).
Đọc về những điều cơ bản trong sách hướng dẫn tại đây.
Ví dụ của bạn
Điều này dẫn đến 4 byte đệm sau 3 integer
của bạn vì timestamp
cột yêu cầu double
căn chỉnh và cần bắt đầu ở bội số 8 byte tiếp theo.
Vì vậy, một hàng chiếm:
23 -- heaptupleheader
+ 1 -- padding or NULL bitmap
+ 12 -- 3 * integer (no alignment padding here)
+ 4 -- padding after 3rd integer
+ 8 -- timestamp
+ 0 -- no padding since tuple ends at multiple of MAXALIGN
Cộng với số nhận dạng mục trên mỗi bộ trong tiêu đề trang (như được chỉ ra bởi @ A.H. Trong nhận xét):
+ 4 -- item identifier in page header
------
= 52 bytes
Vì vậy, chúng tôi đến 52 byte quan sát được .
Phép tính pg_relation_size(tbl) / count(*)
là một ước tính bi quan. pg_relation_size(tbl)
bao gồm bloat (hàng chết) và không gian được dành bởi fillfactor
, cũng như chi phí trên mỗi trang dữ liệu và mỗi bảng. (Và chúng tôi thậm chí đã không đề cập đến việc nén cho varlena
dài dữ liệu trong bảng TOAST, vì nó không áp dụng ở đây.)
Bạn có thể cài đặt mô-đun bổ sung pgstattuple và gọi SELECT * FROM pgstattuple('tbl_name');
để biết thêm thông tin về bảng và kích thước tuple.
Có liên quan:
- Kích thước bảng với bố cục trang
- Tính toán và tiết kiệm dung lượng trong PostgreSQL