Tablo boyutunu heap / index / TOAST kırılımıyla ve en büyük index'leri listele
PostgreSQLDepolamaKomut
SELECT n.nspname AS schema_name,
c.relname AS table_name,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total,
pg_size_pretty(pg_relation_size(c.oid)) AS heap,
pg_size_pretty(pg_indexes_size(c.oid)) AS indexes,
pg_size_pretty(pg_total_relation_size(c.oid) - pg_relation_size(c.oid) - pg_indexes_size(c.oid)) AS toast_fsm_vm,
round(100.0 * pg_total_relation_size(c.oid) / NULLIF(pg_database_size(current_database()), 0), 1) AS pct_of_db
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'm')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 20;
-- En büyük index'ler ve kullanım sayıları
SELECT s.schemaname,
s.relname AS table_name,
s.indexrelname AS index_name,
pg_size_pretty(pg_relation_size(s.indexrelid)) AS index_size,
s.idx_scan,
i.indisunique,
i.indisprimary
FROM pg_stat_user_indexes s
JOIN pg_index i ON i.indexrelid = s.indexrelid
ORDER BY pg_relation_size(s.indexrelid) DESC
LIMIT 20;Ne yapar?
En büyük tabloları toplam, heap, index ve TOAST (+FSM/VM) olarak ayrıştırıp veritabanı içindeki yüzdesiyle; en büyük index'leri ise tarama sayısı ve unique/primary bilgisiyle gösterir.
Ne zaman kullanılır?
Disk doluluğu artarken büyümenin kaynağını (veri mi, index mi, TOAST mu) bulmak ve kullanılmayan büyük index'leri tespit etmek için.
Dikkat
Boyut fonksiyonları her ilişki için dosya sistemine erişir; on binlerce tablolu veritabanlarında yavaş olabilir. Partitioned parent (relkind 'p') kendisi 0 bayttır ve bu listeye alınmaz; hiyerarşinin toplamı için: SELECT pg_size_pretty(sum(pg_total_relation_size(relid))) FROM pg_partition_tree('satislar'); idx_scan = 0 olan büyük index'ler silme adayıdır, ancak sayaçlar son istatistik reset'inden beri ve yalnızca bu sunucu için tutulur (replica'lardaki kullanım görünmez); unique/primary index'ler constraint sağladığı için silinmez.