Saya akan mengatakan pg_column_size melaporkan ukuran terkompresi TOAST nilai ed, sedangkan octet_length melaporkan ukuran yang tidak terkompresi. Saya belum memverifikasi ini dengan memeriksa sumber fungsi atau definisi, tetapi itu masuk akal, terutama karena deretan angka akan terkompresi dengan cukup baik. Anda menggunakan EXTENDED penyimpanan sehingga nilainya memenuhi syarat untuk TOAST kompresi. Lihat TOAST dokumentasi
.
Adapun menghitung ukuran DB yang diharapkan, itu pertanyaan baru. Seperti yang Anda lihat dari demo berikut, itu tergantung pada hal-hal seperti seberapa kompresibel string Anda.
Berikut adalah demonstrasi yang menunjukkan bagaimana octet_length bisa lebih besar dari pg_column_size , mendemonstrasikan di mana TOAST dimulai. Pertama, dapatkan hasil pada output kueri di mana tidak ada TOAST ikut bermain:
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)
Sekarang mari simpan output kueri yang sama ke dalam tabel dan dapatkan ukuran baris yang disimpan:
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)