Este capítulo discute como monitorar a utilização de disco por um sistema de banco de dados PostgreSQL.
Cada tabela possui um arquivo em disco heap [1] [2] [3] primário, onde a maior parte dos dados são armazenados. Se a tabela possuir alguma coluna com valor potencialmente longo, também existirá um arquivo TOAST associado à tabela, utilizado para armazenar os valores muito longos para caber confortavelmente na tabela principal (consulte a Seção 50.2). Haverá um índice para a tabela TOAST, caso esta esteja presente. Também podem haver índices associados à tabela base. Cada tabela e índice é armazenado em um arquivo em disco separado — possivelmente mais de um arquivo, se o arquivo exceder um gigabyte. As convenções para atribuir nomes a estes arquivos estão descritas na Seção 50.1.
O espaço em disco pode ser monitorado a partir de três lugares: do psql utilizando as informações do VACUUM, do psql utilizando as ferramentas presentes em contrib/dbsize, e da linha de comando utilizando as ferramentas presentes em contrib/oid2name. Utilizando o psql em um banco de dados onde o comando VACUUM ou ANALYZE foi executado recentemente, podem ser efetuadas consultas para ver a utilização do espaço em disco de qualquer tabela:
cep=# VACUUM ANALYZE; VACUUM cep=# SELECT relname, relfilenode, relpages cep-# FROM pg_class cep-# WHERE relname LIKE 'tbl_cep_%' cep-# ORDER BY relname; relname | relfilenode | relpages ------------------+-------------+---------- tbl_cep_ac | 17145 | 12 tbl_cep_al | 17148 | 63 tbl_cep_am | 17151 | 91 tbl_cep_ap | 17154 | 9 tbl_cep_ba | 17157 | 260 tbl_cep_ce | 17163 | 216 tbl_cep_df | 17166 | 289 tbl_cep_es | 17169 | 218 tbl_cep_especial | 17229 | 213 tbl_cep_go | 17172 | 316 tbl_cep_ma | 17175 | 67 tbl_cep_mg | 17178 | 763 tbl_cep_mrj | 17181 | 300 tbl_cep_ms | 17184 | 129 tbl_cep_mt | 17233 | 112 tbl_cep_pa | 17187 | 139 tbl_cep_pb | 17190 | 105 tbl_cep_pe | 17193 | 450 tbl_cep_pi | 17196 | 41 tbl_cep_pr | 17199 | 482 tbl_cep_rj | 17202 | 842 tbl_cep_rn | 17205 | 94 tbl_cep_ro | 17208 | 34 tbl_cep_rr | 17211 | 13 tbl_cep_rs | 17214 | 401 tbl_cep_sc | 17217 | 245 tbl_cep_se | 17220 | 34 tbl_cep_sp | 17223 | 2755 tbl_cep_to | 17226 | 46 tbl_cep_uf | 17231 | 1 (30 linhas)
Cada página possui, normalmente, 8 kilobytes (Lembre-se, relpages somente é atualizado por VACUUM, ANALYZE e uns poucos comandos de DDL como CREATE INDEX). O valor de relfilenode possui interesse caso se deseje examinar diretamente o arquivo em disco da tabela.
Para ver o espaço utilizado pelas tabelas TOAST deve ser utilizada uma consulta como a mostrada abaixo:
-- Ver as tabelas TOAST da tabela pg_rewrite cep=# SELECT relname, relpages cep-# FROM pg_class, cep-# (SELECT reltoastrelid FROM pg_class cep(# WHERE relname = 'pg_rewrite') ss cep-# WHERE oid = ss.reltoastrelid cep-# OR oid = (SELECT reltoastidxid FROM pg_class cep(# WHERE oid = ss.reltoastrelid) cep-# ORDER BY relname; relname | relpages ----------------------+---------- pg_toast_16410 | 14 pg_toast_16410_index | 2 (2 linhas)
Os tamanhos dos índices também podem ser facilmente exibidos:
cep=# ALTER TABLE tbl_cep_sp ADD PRIMARY KEY (cep); NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "tbl_cep_sp_pkey" for table "tbl_cep_sp" ALTER TABLE cep=# SELECT c2.relname, c2.relpages cep-# FROM pg_class c, pg_class c2, pg_index i cep-# WHERE c.relname = 'tbl_cep_sp' cep-# AND c.oid = i.indrelid cep-# AND c2.oid = i.indexrelid cep-# ORDER BY c2.relname; relname | relpages -----------------+---------- tbl_cep_sp_pkey | 619 (1 linha) -- Verificar se relpages foi atualizada na criação do índice cep=# VACUUM FULL ANALYZE; VACUUM cep=# SELECT c2.relname, c2.relpages cep-# FROM pg_class c, pg_class c2, pg_index i cep-# WHERE c.relname = 'tbl_cep_sp' cep-# AND c.oid = i.indrelid cep-# AND c2.oid = i.indexrelid cep-# ORDER BY c2.relname; relname | relpages -----------------+---------- tbl_cep_sp_pkey | 619 (1 linha) -- O valor de relpages não mudou após VACUUM FULL ANALYZE
Utilizando a consulta abaixo, é fácil descobrir quais são as quatro maiores tabelas e índices:
cep=# SELECT relname, relpages cep-# FROM pg_class cep-# ORDER BY relpages DESC cep-# LIMIT 4; relname | relpages -----------------+---------- tbl_cep_sp | 2754 tbl_cep_rj | 841 tbl_cep_mg | 762 tbl_cep_sp_pkey | 619 (4 linhas) -- Como pode ser visto, VACUUM FULL ANALYZE diminuiu uma página -- de tbl_cep_sp após VACUUM ANALYZE (2755 para 2754).
Calcular o número de páginas da tabela tbl_cep_sp através das informações do sistema de arquivos, utilizando o nome de arquivo presente em relfilenode (N. do T.):
$ locate 17223 | grep /var/lib/pgsql/data/base/ /var/lib/pgsql/data/base/17142/17223 $ ls -l /var/lib/pgsql/data/base/17142/17223 -rw------- 1 postgres postgres 22560768 Jul 28 07:44 /var/lib/pgsql/data/base/17142/17223 $ expr 22560768 / 8 / 1024 2754
Como cada página possui 8 kilobytes, dividindo-se o tamanho do arquivo igual a 22.560.768 bytes por 8 e por 1024 chega-se a um número de páginas igual a 2754, o mesmo informado pela consulta.
A ferramenta contrib/dbsize carrega funções no banco de dados que permitem descobrir o tamanho da tabela ou do banco de dados a partir do psql sem necessidade do VACUUM ou do ANALYZE.
Para mostrar a utilização de disco também pode ser utilizada a ferramenta contrib/oid2name. Veja exemplo em README.oid2name neste diretório. Inclui um script que mostra utilização de disco para cada banco de dados.
[1] |
Oracle — HEAP indica que as linhas de dados da tabela não são armazenadas em nenhuma ordem específica. Este é o padrão. Oracle Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01® (N. do T.) |
[2] |
SQL Server — heap é uma tabela sem um índice agrupado (clustered). SQL Server 2005 Books Online — Heap Structures (N. do T.) |
[3] |
DB2 — As tabelas regulares são implementadas como heap. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |