Descubra como otimizar seu banco de dados com particionamento no PostgreSQL
O particionamento é um dos recursos mais desejados do PostgreSQL, amplamente adotado pelos desenvolvedores. Isso não é verdade apenas para o PostgreSQL 15, mas também para versões mais antigas que não ofereciam tantos recursos quanto a versão mais recente do banco de dados. É por isso que você deve saber não apenas como particionar tabelas corretamente, mas também como descobrir a qual partição um dado pertence.
O particionamento no PostgreSQL é uma técnica que permite dividir uma tabela grande em várias partes menores, conhecidas como partições, de forma transparente para o usuário. Cada partição é armazenada em um arquivo separado, o que pode melhorar o desempenho em consultas e operações de manutenção de dados.
Existem dois tipos de particionamento no PostgreSQL:
- Particionamento por intervalo: as partições são criadas com base em um intervalo de valores de uma coluna específica da tabela. Por exemplo, se a tabela for particionada por data, cada partição pode conter os dados de um determinado ano.
- Particionamento por lista: as partições são criadas com base em uma lista de valores de uma coluna específica da tabela. Por exemplo, se a tabela for particionada por região, cada partição pode conter os dados de uma região específica.
Para criar partições em uma tabela no PostgreSQL, é necessário seguir os seguintes passos:
- Criar a tabela pai: essa tabela deve conter a definição das colunas que serão particionadas, mas não deve ter dados.
- Criar as tabelas filhas: cada tabela filha representa uma partição da tabela pai e deve conter a mesma estrutura da tabela pai.
- Definir as regras de particionamento: isso é feito usando a cláusula “CREATE TABLE … PARTITION BY” e especificando o tipo de particionamento e a coluna que será usada como referência.
- Inserir dados nas partições: isso pode ser feito usando a cláusula “INSERT INTO … VALUES” ou “INSERT INTO … SELECT” para inserir dados em cada partição.
Portanto, há uma pequena questão que sempre surge: como descubro em qual partição acabei de inserir meus dados? Alguns pequenos “truques de velho consultor” podem ajudar a descobrir.
Para começar, primeiro você precisa criar uma atabela particionada:
CREATETABLEt_turnover (id serial,country text,t timestamptz,task text,turnovernumeric) PARTITIONBYLIST (country);CREATETABLEt_austriaPARTITIONOFt_turnoverFORVALUESIN('Austria');CREATETABLEt_usaPARTITIONOFt_turnoverFORVALUESIN('USA');CREATETABLEt_ger_swissPARTITIONOFt_turnoverFORVALUESIN('Germany','Switzerland');
Nesse caso, você criou uma tabela simples para armazenar o faturamento. Atualmente, 4 idiomas são suportados. No entanto, muitas vezes você desejará dizer ao PostgreSQL que todos os outros dados devem ir para uma partição padrão. Veja como criar essa partição padrão:
CREATETABLEt_rest PARTITIONOFt_turnoverDEFAULT;CREATETABLE
Esta tabela conterá todos os dados que não devem ir para nenhuma outra partição.
Insert em uma tabela particionada
Agora, vamos inserir nesta tabela e ver o que acontece:
sample=# \xExpanded displayison.sample=#INSERTINTOt_turnover (country, t, task, turnover)VALUES('Uganda', now(),'Some task', 200)RETURNING tableoid::regclass, *;-[ RECORD 1 ]---------------------------tableoid | t_restid | 1country | Ugandat | 2022-11-01 09:35:38.991547+01task |Sometaskturnover | 200
Aplicamos um pequeno truque aqui: No caso de INSERT, você pode usar RETURNING *, que é uma maneira simples e comumente usada para ver o que você acabou de inserir. Porém, há mais: Existe uma coluna oculta chamada “tableoid”: Ela representa o ID do objeto da tabela que você acabou de inserir. Observe que este é o ID do objeto da partição – não da tabela pai.
Select de uma tabela particionada
Até agora, você viu que pode usar o tableoid para determinar a partição em INSERT. No entanto, você também pode fazer a mesma coisa ao consultar a tabela:
sample=#SELECTtableoid, tableoid::regclass, *FROMt_turnoverORDERBYid;tableoid | tableoid | id | country | t | task | turnover----------+-----------+----+---------+-------------------------------+--------------------+----------27616 | t_rest | 1 | Uganda | 2022-11-01 09:35:30.193676+01 |Sometask | 20027597 | t_austria | 3 | Austria | 2022-11-01 11:11:40.583728+01 | PostgreSQL support | 900(3rows)
sample=#SELECTtableoid::regclass,count(*)FROMt_turnoverGROUPBY1ORDERBY1;tableoid |count-----------+-------t_austria | 1t_rest | 1(2rows)
Líder em Treinamento e serviços de Consultoria, Suporte e Implantação para o mundo open source. Conheça nossas soluções:
About author
Você pode gostar também
Índices são sempre bons?
Sabemos amplamente que índices são ferramentas que ajudam no desempenho de qualquer SGBD. Mas, como qualquer outro recurso, existe um equilíbrio entre custo e benefício. Em muitas situações, vale a pena
Por que você deve investir tempo estudando Python
Por que você deve investir tempo estudando Python No mundo cada vez maior das linguagens de programação, uma delas se destaca como uma ferramenta versátil e poderosa que conquistou os
Descubra o TimescaleDB: O banco de dados SQL para séries temporais
Hoje vamos falar um pouco sobre o TimescaleDB … Mas afinal, o que seria esse tal de TimescaleDB? Respondendo a pergunta acima, TimescaleDB (TSDB) é um banco de dados de







