Tamanho de tabelas no PostgreSQL

Caros, hoje pretendo ser o mais breve possível apresentando uma dica rápida, eu precisava ver o tamanho das tabelas no psql, essa funcionalidade não existia, até agora…

Pois bem, apesar de existirem algumas ferramentas gráficas como o Aqua Studio, DbVisualizer e o próprio pgAdminIII, o meu fiel companheiro de todos os dias acaba sendo o bom e velho psql. Leve, simples e bastante completo ele me proporciona agilidade em muitas das minhas tarefas diárias.

Nessas últimas versões ele vem recebendo algumas características novas. Uma delas que podemos esperar para a versão 8.4, por exemplo, é uma melhoria do comando “\l+” que, nessa versão, mostra também os tamanhos que os bancos de dados ocupam:

analise=# \l+
                                                               List of databases
   Name    |   Owner   | Encoding |                    Access Privileges                     |  Size   | Tablespace |        Description
-----------+-----------+----------+----------------------------------------------------------+---------+------------+---------------------------
 analise   | postgres  | UTF8     | {sademo=CTc/postgres,postgres=CTc/postgres,=Tc/postgres} | 151 MB  | pg_default |
 bench     | postgres  | UTF8     |                                                          | 710 MB  | pg_default |
 postgres  | postgres  | UTF8     |                                                          | 4215 kB | pg_default |
 livraria  | sasebo    | UTF8     |                                                          | 4136 kB | pg_default |
 template0 | postgres  | UTF8     | {=c/postgres,postgres=CTc/postgres}                      | 4136 kB | pg_default |
 template1 | postgres  | UTF8     | {postgres=CTc/postgres,=c/postgres}                      | 4136 kB | pg_default | default template database

No entanto, para o comando “\d+”, não foi implementada a mesma idéia, ou seja, ele não lista o tamanho dos objetos (visões, tabelas, sequências, indices) e por isso eu acabei criando o patch abaixo que, uma vez aplicado na versão última versão do PostgreSQL no CVS, habilita essa característica no psql:

Nota! Eu submetio patch para a pgsql-hackers e ele foi aceito e comitado, então na versão 8.4 ele já estará disponível…

Index: describe.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/describe.c,v
retrieving revision 1.166
diff -c -r1.166 describe.c
*** describe.c  30 Mar 2008 18:10:20 -0000  1.166
--- describe.c  11 Apr 2008 04:59:56 -0000
***************
*** 1766,1775 ****
--- 1766,1781 ----
                          gettext_noop("Table"));

    if (verbose)
+   {
        appendPQExpBuffer(&buf,
              ",\n  pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
                          gettext_noop("Description"));

+       appendPQExpBuffer(&buf,
+             ",\n  pg_catalog.pg_size_pretty(pg_catalog.pg_relation_size(c.oid)) as \"%s\"",
+                         gettext_noop("Size"));
+   }
+
    appendPQExpBuffer(&buf,
                      "\nFROM pg_catalog.pg_class c"
                    "\n     JOIN pg_catalog.pg_roles r ON r.oid = c.relowner"
***************
*** 1809,1816 ****
    processSQLNamePattern(pset.db, &buf, pattern, true, false,
                          "n.nspname", "c.relname", NULL,
                          "pg_catalog.pg_table_is_visible(c.oid)");
!
!   appendPQExpBuffer(&buf, "ORDER BY 1,2;");

    res = PSQLexec(buf.data, false);
    termPQExpBuffer(&buf);
--- 1815,1825 ----
    processSQLNamePattern(pset.db, &buf, pattern, true, false,
                          "n.nspname", "c.relname", NULL,
                          "pg_catalog.pg_table_is_visible(c.oid)");
!
!   if (verbose)
!       appendPQExpBuffer(&buf, "ORDER BY 1, pg_catalog.pg_relation_size(c.oid) DESC, 2;");
!   else
!       appendPQExpBuffer(&buf, "ORDER BY 1,2;");

    res = PSQLexec(buf.data, false);
    termPQExpBuffer(&buf);

O que eu faço é mostrar uma coluna a mais (“Size”), e ordenar a saída por Esquema, Tamanho (decrescente) e Nome do objeto. A saída fica algo assim:

analise=# \d+
                                      List of relations
 Schema  |                Name                | Type  |   Owner      | Description |    Size
---------+------------------------------------+-------+--------------+-------------+------------
 teste   | tb_cliente                         | table | sa_analiseq  | Cliente     | 8192 bytes
 teste   | tb_compra                          | table | sa_analise   | Compra      | 8192 bytes
 teste   | tb_item_compra                     | table | sa_analise   | ItemCompra  | 8192 bytes
 teste   | tb_produto                         | table | sa_analise   | Produto     | 8192 bytes
 financ  | tb_caixa                           | table | sa_analise   | Caixa       | 517 MB
 financ  | tb_banco                           | table | sa_analise   | Banco       | 80 MB
 generic | tb_cliente                         | table | sa_analise   | Cliente     | 250 MB
 generic | tb_pessoa                          | table | sa_analise   | Pessoa      | 140 MB

Bom, é isso! “:D

comments powered by Disqus