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)