2012-11-20 127 views
0

我在PostgreSQL數據庫中有一個表,並且從這個表中選擇了一些限制條件,並且我想知道這個選擇有多少磁盤空間。我知道有一個postgres函數pg_total_relation_size,它給了我一些在DB中的表的大小,但我怎麼能找到'subtable'的大小?PostgreSQL選擇結果大小

任何想法?

我使用PostgreSQL 9.1

+0

select語句沒有「磁盤大小」,因爲它沒有存儲在任何地方。 –

+0

好的,所以我需要先存儲它才能獲得大小?有其他的選擇嗎?我的意思是,我只是想知道一個子表的大小... – golinko

+0

你可以將其假脫機到一個文本文件,以粗略估計數據的原始大小 –

回答

6

要獲取的數據大小,從而允許TOAST壓縮等:

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

要獲得所需的磁盤存儲包括塊分配開銷,標頭,等等等等:

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) 

爲什麼結果如此不同?因爲後者查詢報告主表的8k塊的大小,以及TOAST表的8k塊的大小。它並不在意這些塊大部分是空的。

+0

謝謝,這正是我所期待的,'octet_length'也是可以的,但它給了我二進制字符串中的字節數,所以如果字符串只是一個文本,我會得到錯誤的大小... – golinko

+0

@ann octet_length也不會準確反映TOAST的空間使用情況。請參閱http://stackoverflow.com/questions/13304572/how-can-pg-column-size-be-smaller-than-octet-length –

+0

16384?這是什麼意思?它是在kb還是字節? –