Como determinar o Tamanho de Uma Tabela do Postgres
Autor: Anderson | Publicado: 2011-04-29T12:05:00-07:00

A algum tempo atrás, surgiu a necessidade de saber o tamanho de cada  tabela em bytes, numa base de dados (database) Postgresql. Era  necessário para estimar o crescimento destas tabelas e saber quanto  tempo levaria que esgotar a capacidade do HD.Nesta pesquisa encontrei muitos dados interessantes que irei  compartilhar com vocês. Claro que para alguns não terá novidade nenhuma  nesta matéria, mas com certeza será valioso para alguém como foi para  mim. Antes de começar temos que entender como o postgresql gerencia os arquivos da base de dados, então vamos explora-lo. Como PostgreSQL gerencia os arquivos da base de dados ? O conceito fundamental do Postgresql e de outros SGBDS é que os dados  são armazenados em tabelas e as tabelas agrupadas em base de dados  (databases). Em um nível mais alto desta organização as base de dados  são agrupadas em clusters – e um cluster de base de dados é gerenciado  pelo postmaster.E como fica essa hierarquia no disco ?Para descobrir como funciona essa hierarquia na prática vamos fazer umas consultas (queries) , executar um comandos no shell.Vamos começar conectando a base de dados e descobrindo o OID (Obect ID) através de uma consulta. ~$ psql book -U postgres book=# SELECT datname, oid from pg_database;   datname oid   postgres 10819   book 16384   template1 1   template0 10818   (4 registros)  Na resposta da nossa query podemos ver que temos 4 base de dados  (databases) no cluster. Agora podemos encontrar as base de dados no  disco dentro do diretório $PG_DATA. ~$ cd $PG_DATA~$ lsbase    pg_clog      pg_ident.conf  pg_subtrans  pg_twophase  pg_xlog postmaster.optsglobal  pg_hba.conf  pg_multixact   pg_tblspc    PG_VERSION   postgresql.conf  postmaster.pid Dentro do subdiretório base encontra-se as base de dados no SELECT  que executamos antes tem um oid 1 para a base de dados (datname)  template1. Vamos entrar dentro do diretório base e ver o que tem por lá.~$ cd base~$ ls -ladrwx——  2 postgres postgres 2648 Jul 11 11:17 1drwx——  2 postgres postgres 2648 Jul 11 11:17 10818drwx——  2 postgres postgres 2680 Jul 11 11:18 10819drwx——  2 postgres postgres 2680 Jul 11 11:39 16384 Neste exemplo temos 4 diretórios o mesmo números de registros quando  executamos o SELECT então isso demonstra que o OID(object ID)  corresponde ao nome do diretorio dentro da base de dados. Como exemplo o  diretórios  1 corresponde a base de dados template1.Entrando no diretório 1 podemos ver que existem vários arquivos vamos descobrir  o que significa cada um deles. ~$ cd 1~$ ls10737  10747  10757  10767  1250  2603  2609  2615  2650  2656  2662   2668  2678  2684 690  2700  2831  2837 10739  10749  10759  10769  1255   2604  2610  2616  2651  2657  2663  2669….…. Para saber o que significa cada um desses arquivos temos que  descobrir os OIDS dentro da base de dados template1. Vamos voltar ao  psql ~$ psql -q -d template1template1=# select oid, relname from pg_class;   oid relname   10762 sql_sizing   10769 pg_toast_10767   10771 pg_toast_10767_index   10767 sql_sizing_profiles   10772 table_constraints   10776 table_privileges   10780 tables   10784 triggered_update_columns   10787 triggers   Na tabela pg_class existe mais informação que pode nos ajudar a explorar a estrutura de armazenamento do PostgreSQL. psql book -Upostgresbook=# select relname,oid,relpages, reltuples FROM pg_class ORDER BY OID;    relname oid relpages reltuples  pg_type 1247 5 242   pg_autovacuum 1248 0 0   pg_attribute 1249 28 1628   pg_autovacuum_vacrelid_index 1250 1 0   pg_proc 1255 45 1929   pg_class 1259 5 204   A coluna reltuples informa quantas tuplas tem em cada tabela. Já a coluna relpages mostra quantas páginas (pages) são requiridas para armazenar o conteúdo da tabela. Qual a correspondência entre relpages e reltuples com o tamanho do arquivo no disco ? Vamos listar o conteúdo do diretório e pegar dois exemplos $ ls -l 1247 1249 -rw------- 1 postgres postgres  40960 Jul  11 11:17 1247 -rw------- 1 postgres postgres 229376 Jul 11 11:17 1249  O arquivo chamado 1247 tabela pg_type ocupa um espaço em disco e 40960 bytes. Se dividirmos 40960/5 relpages  = 8192 bytes, realizando o mesmo cálculo para a tabela  pg_attribute que corresponde ao arquivo 1249 que possui um tamanho em disco de 229376 bytes / 28 relpages = 8192 bytes.O tamanho 8192 refere-se ao tamanho da página este valor é fixo como podemos verificar. Com esta matéria  acho que consegui mostrar como o PostgreSQL estrutura os dados no disco.E como descobrir o tamanho da tabela no Hd, com certeza existe outras  maneiras mas escolhi está para demonstrar também como o postgresql  organiza as tabelas no HD.