make all

cd /usr/src/universe && make all

Tamanho de tabelas no PostgreSQL

Escrito por Guedes em Abril 11, 2008

Tamanho de tabelas no PostgreSQLCaros, hoje pretendo ser o mais breve possível apresentando uma dica rápida. 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:

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

2 Respostas para “Tamanho de tabelas no PostgreSQL”

  1. Leo Disse:

    Opa! Blz Guedes?

    Mergulhou nas profundezas do psql mesmo hein?!?
    Sugestão: discuta o patch na hackers.

    Abraço!

    -Leo

  2. Guedes Disse:

    Leo Disse:
    Abril 11, 2008 às 10:30 am e

    Opa! Blz Guedes?

    Mergulhou nas profundezas do psql mesmo hein?!?
    Sugestão: discuta o patch na hackers.

    Abraço!

    -Leo

    Opa Leo!

    Com certeza… de vez em quando um modulo avançado é bom para aguçar os neurônios… pois bem a dica é valida. Vou postar por lá.

    Abraço!

Deixe um comentário

XHTML: Você pode usar estas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>