PostgreSQL pilih ukuran hasil

Saya memiliki tabel di PostgreSQL DB dan memilih dari tabel ini dengan beberapa kendala, dan kemudian saya ingin tahu berapa banyak ruang disk yang dimiliki pilihan ini. Saya tahu ada fungsi postgres pg_total_relation_size yang memberi saya ukuran beberapa tabel di DB, tapi bagaimana saya bisa menemukan ukuran 'subtabel'?

Ada Ide?

Saya menggunakan PostgreSQL 9.1


person golinko    schedule 20.11.2012    source sumber
comment
Pernyataan pilih tidak memiliki ukuran disk, karena tidak disimpan di mana pun.   -  person a_horse_with_no_name    schedule 20.11.2012
comment
Oke, jadi saya harus menyimpannya dulu untuk mengetahui ukurannya? Apakah ada alternatif lain? Maksudku, aku hanya ingin tahu ukuran subtabel...   -  person golinko    schedule 20.11.2012
comment
Anda dapat menggabungkannya ke dalam file teks untuk mendapatkan perkiraan kasar ukuran mentah data   -  person a_horse_with_no_name    schedule 20.11.2012
comment
Saya baru saja menemukan alternatif berikut: select sum(octet_length(temp.*::text)) from (select * from lesson) as temp Berhasil dan saya mendapatkan ukuran tabel dalam representasi teks.   -  person golinko    schedule 20.11.2012


Jawaban (1)


Untuk mendapatkan ukuran data, memungkinkan kompresi TOAST, dll:

regress=> SELECT sum(pg_column_size(devices)) FROM devices WHERE country = 'US';
 sum 
-----
 105
(1 row)

Untuk mendapatkan penyimpanan disk yang diperlukan termasuk overhead alokasi blok, header, dll:

regress=> CREATE TEMPORARY TABLE query_out AS SELECT * FROM devices WHERE country = 'US';
SELECT 3
regress=> SELECT pg_total_relation_size('query_out');
 pg_total_relation_size 
------------------------
                  16384
(1 row)

Mengapa hasilnya sangat berbeda? Karena kueri terakhir melaporkan ukuran blok 8k untuk tabel utama, dan blok 8k untuk tabel TOAST. Tidak peduli sebagian besar blok ini kosong.

person Craig Ringer    schedule 20.11.2012
comment
Terima kasih, itulah yang saya cari, octet_length juga oke, tetapi ini memberi saya jumlah byte dalam string biner, jadi saya akan mendapatkan ukuran yang salah jika string hanya berupa teks... - person golinko; 21.11.2012
comment
@ann octet_length juga tidak akan mencerminkan penggunaan ruang dari TOAST secara akurat. Lihat stackoverflow.com/questions/13304572/ - person Craig Ringer; 22.11.2012
comment
16384? Apa artinya ini? Apakah dalam kb atau byte? - person Mohd Anas; 20.11.2014
comment
@MohdAnas Ya, manual untuk pg_total_relation_size mengatakan byte. Jadi saya kira itu byte. Kalau mau printnya cantik pakai pg_size_pretty - person Craig Ringer; 20.11.2014
comment
@CraigRinger terima kasih... Bisakah Anda memberi tahu saya apa yang harus saya lakukan jika saya ingin mendapatkan ukuran beberapa tabel dalam satu permintaan? - person Mohd Anas; 20.11.2014
comment
@MohdAnas Bergabung di pg_class, atau tentukan beberapa nama tabel secara manual, atau gunakan daftar VALUES. Sama seperti jenis pertanyaan lainnya, sungguh. - person Craig Ringer; 21.11.2014
comment
@CraigRinger, Bisakah Anda menulis contoh pertanyaan? - person Mohd Anas; 21.11.2014
comment
@MohdAnas Jika Anda mengalami kebuntuan setelah mencobanya sendiri, silakan kirim pertanyaan baru. Harap tautkan kembali ke yang ini untuk mengetahui konteksnya saat Anda melakukannya. - person Craig Ringer; 21.11.2014
comment
@CraigRinger Tentu. Terima kasih - person Mohd Anas; 21.11.2014
comment
@CraigRinger, Ini pertanyaan saya, silakan lihat stackoverflow.com/questions/27054654/ - person Mohd Anas; 21.11.2014