PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tìm hiểu về kích thước hàng Postgres

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách ghi các truy vấn trong PostgreSQL

  2. PostgreSQL:Sáu mảnh không dễ dàng

  3. Bỏ qua dấu ngoặc kép để thực hiện truy vấn trên PostgreSQL

  4. SQL LIKE điều kiện để kiểm tra số nguyên?

  5. Làm thế nào để làm tròn số trung bình đến 2 chữ số thập phân trong PostgreSQL?