PostgreSQL – Tablo Boyutlarının Listelenmesi
Çoğu veritabanı sisteminde olduğu gibi PostgreSQL de objelerin disk boyutlarının kolayca hesaplanabilmesi için bize çeşitli sistem fonksiyonları sunuyor. Bir tablonun boyutunu bu fonksiyonları kullanarak alabiliyoruz. Bu fonksiyonlardan;
pg_table_sizeBir tablonun indexleri hariç kapladığı alanpg_total_relation_sizeBir tablonun her şey dahil kapladığı alanpg_relation_sizeBir objenin (tablo index vs ) diskte kapladığı alan. Bu fonksiyondan ek parametre ile daha detaylı bilgi almak mümkün.pg_size_prettyDiğer fonksiyonlar byte olarak döner. Bunu okunabilir formata çevirir (kb, mb, gb gibi)
Bir tablonun boyutuna bakalım; size_test_table tablosunun içerisinde 1 adet index bulunuyor (primary key). Tablo buyutunu aşağıdaki şekilde alıyoruz;
SELECT pg_table_size('size_test_table') AS data_size,
pg_relation_size('size_test_table_pkey') AS index_size,
pg_table_size('size_test_table') + pg_relation_size('size_test_table_pkey') AS total_size1,
pg_total_relation_size('size_test_table') AS total_size2;
Sonuç;

Daha güzel gösterelim;
SELECT pg_size_pretty(pg_total_relation_size('size_test_table'));

Bir veritabanı üzerindeki tüm tabloları schema, tablo adı ve index ve tablespace olarak listeleyelim. Böylece hangi tablo veya index aslen hangi diskimizde ne kadar yer kaplıyor görebiliriz. PostgreSQL’e bir tabloya ait indexler farklı tablespace’de (dolayısıyla istenirse farklı diskte) olabilir.
WITH tbl_spc AS (
SELECT ts.spcname AS spcname
FROM pg_tablespace ts
JOIN pg_database db ON db.dattablespace = ts.oid
WHERE db.datname = current_database()
)
(
SELECT
t.schemaname,
t.tablename,
pg_table_size('"' || t.schemaname || '"."' || t.tablename || '"') AS table_disc_size,
NULL as index,
0 as index_disc_size,
COALESCE(t.tablespace, ts.spcname) AS tablespace
FROM pg_tables t, tbl_spc ts
UNION ALL
SELECT
i.schemaname,
i.tablename,
0,
i.indexname,
pg_relation_size('"' || i.schemaname || '"."' || i.indexname || '"'),
COALESCE(i.tablespace, ts.spcname)
FROM pg_indexes i, tbl_spc ts
);
Dilerseniz yukarıdaki sorgudan bir view oluşturup view’dan sorgulama yapabilirsiniz;
CREATE OR REPLACE VIEW v_disc_spaces AS
WITH tbl_spc AS (
SELECT ts.spcname AS spcname
FROM pg_tablespace ts
JOIN pg_database db ON db.dattablespace = ts.oid
WHERE db.datname = current_database()
)
(
SELECT
t.schemaname,
t.tablename,
pg_table_size('"' || t.schemaname || '"."' || t.tablename || '"') AS table_disc_size,
NULL as index,
0 as index_disc_size,
COALESCE(t.tablespace, ts.spcname) AS tablespace
FROM pg_tables t, tbl_spc ts
UNION ALL
SELECT
i.schemaname,
i.tablename,
0,
i.indexname,
pg_relation_size('"' || i.schemaname || '"."' || i.indexname || '"'),
COALESCE(i.tablespace, ts.spcname)
FROM pg_indexes i, tbl_spc ts
);
Sonrasında bir şemadaki tüm tabloların alfabetik olarak boyutlarıyla beraber listeme;
SELECT tablename, pg_size_pretty(sum(table_disc_size)) AS table_disc_size, pg_size_pretty(sum(index_disc_size)) AS index_disc_size FROM v_disc_spaces WHERE schemaname = 'public' GROUP BY tablename ORDER BY tablename;
Toplam boyutu en büyük 10 tablonun listelenmesi için;
SELECT
t.tablename,
pg_size_pretty(pg_total_relation_size('"' || t.schemaname || '"."' || t.tablename || '"')) AS table_total_disc_size
FROM pg_tables t
WHERE
t.schemaname = 'public'
ORDER BY
pg_total_relation_size('"' || t.schemaname || '"."' || t.tablename || '"') DESC
LIMIT 10;
Yukarıdaki sorgular farklı sistem viewları içerisinden alınabilir. Örneğin, pg_tables yerine pg_class kullanarak da tabloları listeleyebilirdik. Artık orası sizin yaratıcılığınız.
Referanslar
![]()
