Descobrir tamanho de uma tabela em disco

<< Click to Display Table of Contents >>

Navigation:  PostgreSQL > Avançado >

Descobrir tamanho de uma tabela em disco

Previous pageReturn to chapter overviewNext page

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

~$ ls

base pg_clog pg_ident.conf pg_subtrans pg_twophase pg_xlog postmaster.opts

global 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 -la

drwx—— 2 postgres postgres 2648 Jul 11 11:17 1

drwx—— 2 postgres postgres 2648 Jul 11 11:17 10818

drwx—— 2 postgres postgres 2680 Jul 11 11:18 10819

drwx—— 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

~$ ls

10737 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 template1

template1=# 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 -Upostgres

book=# 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.

 

Referência:

Livro PostgreSQL - Korry Douglas e Susan Douglas

 

Pessoal estou participando do concurso Intel Moblin com o projeto MobPicture que é um projeto para processamento de imagem em dispositivos móveis. Se acharem interessante o projeto votem. Desda já agradeço.