Postgres: sprawdzić miejsce na dysku zajęte przez widok zmaterializowany?

14

Wiem, jak sprawdzić rozmiar indeksów i tabel w Postgres (używam wersji 9.4):

SELECT
   relname AS objectname,
   relkind AS objecttype,
   reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size
   FROM pg_class
   WHERE relpages >= 8
   ORDER BY relpages DESC;

Ale to nie pokazuje zmaterializowanych poglądów. Jak mogę sprawdzić, ile miejsca na dysku zajmują?

Richard
źródło

Odpowiedzi:

23

Jest to przy założeniu, że zostały zmaterializowane perspektywy relpages >= 8w pg_class, co nie musi być prawdą. Może być faktycznie pusty - jeszcze nie wypełniony, na co wskazuje pg_class.relispopulated = FALSE. Odpowiedni plik dyskowy ma w tym przypadku rozmiar zerowy .

Spróbuj zamiast tego:

SELECT relname   AS objectname
     , relkind   AS objecttype
     , reltuples AS entries
     , pg_size_pretty(pg_table_size(oid)) AS size  -- depending - see below
FROM   pg_class
WHERE  relkind IN ('r', 'i', 'm')
ORDER  BY pg_table_size(oid) DESC;

Gdzie dostępne są typy :

r= zwykła tabela,
i= indeks,
S= sekwencja,
v= widok,
m= widok zmaterializowany,
c= typ złożony,
t= tabela TOAST,
f= tabela obca

Użyj jednej z funkcji rozmiaru obiektu bazy danych zamiast budować własną. Należy pamiętać, że „rozmiar tabeli” można zdefiniować na różne sposoby. Detale:

Erwin Brandstetter
źródło
1
Rzeczywiście poprawna odpowiedź. Zwróć uwagę, że kolejność według rozmiaru jest myląca, ponieważ drukujesz rozmiar w formie czytelnej dla człowieka, co sprawia, że ​​sortowanie jest sortowane leksykograficznie
Jack
@Jack: Dobra uwaga. Dodałem bardziej rozsądny ORDER BY.
Erwin Brandstetter,