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)