Tôi muốn nói pg_column_size đang báo cáo kích thước nén của TOAST giá trị ed, trong khi octet_length đang báo cáo các kích thước không được nén. Tôi chưa xác minh điều này bằng cách kiểm tra nguồn hoặc định nghĩa hàm, nhưng nó sẽ có ý nghĩa, đặc biệt là vì các chuỗi số sẽ nén khá tốt. Bạn đang sử dụng EXTENDED bộ nhớ để các giá trị đủ điều kiện cho TOAST nén. Xem TOAST tài liệu
.
Đối với việc tính toán kích thước DB dự kiến, đó là một câu hỏi hoàn toàn mới. Như bạn có thể thấy từ bản trình diễn sau, nó phụ thuộc vào những thứ như mức độ nén các chuỗi của bạn.
Đây là phần trình bày cách octet_length có thể lớn hơn pg_column_size , chứng minh nơi TOAST bắt đầu. Đầu tiên, hãy lấy kết quả trên đầu ra truy vấn mà không có TOAST phát huy tác dụng:
regress=> SELECT octet_length(repeat('1234567890',(2^n)::integer)), pg_column_size(repeat('1234567890',(2^n)::integer)) FROM generate_series(0,12) n;
octet_length | pg_column_size
--------------+----------------
10 | 14
20 | 24
40 | 44
80 | 84
160 | 164
320 | 324
640 | 644
1280 | 1284
2560 | 2564
5120 | 5124
10240 | 10244
20480 | 20484
40960 | 40964
(13 rows)
Bây giờ, hãy lưu trữ cùng một kết quả truy vấn đó vào một bảng và lấy kích thước của các hàng được lưu trữ:
regress=> CREATE TABLE blah AS SELECT repeat('1234567890',(2^n)::integer) AS data FROM generate_series(0,12) n;
SELECT 13
regress=> SELECT octet_length(data), pg_column_size(data) FROM blah;
octet_length | pg_column_size
--------------+----------------
10 | 11
20 | 21
40 | 41
80 | 81
160 | 164
320 | 324
640 | 644
1280 | 1284
2560 | 51
5120 | 79
10240 | 138
20480 | 254
40960 | 488
(13 rows)