O particionamento de tabelas divide uma tabela grande em segmentos menores e gerenciados independentemente com base no valor de uma coluna. Em tabelas de fatos ou extensas, essa técnica acelera a exclusão e o carregamento de dados ao permitir operações sobre uma partição inteira de uma só vez, em vez de verificar linhas individualmente.
Remova todos os dados de uma partição com
ALTER TABLE DROP PARTITION— muito mais rápido do que excluir linhas uma a uma.Carregue um novo lote de dados via troca de partição com
ALTER TABLE EXCHANGE PARTITION, evitando gravações na tabela inteira.
Quando usar o particionamento de tabela
Antes de particionar uma tabela, confirme os seguintes pontos:
A tabela é grande. Tabelas com milhões ou bilhões de linhas são fortes candidatas. Para tabelas com apenas alguns milhares de linhas, a sobrecarga administrativa geralmente supera os ganhos de desempenho.
As consultas filtram por uma coluna específica. O particionamento é eficaz quando as cláusulas
WHEREreferenciam consistentemente a chave de partição, permitindo que o planejador de consultas ignore partições irrelevantes.Os dados são gerenciados por tempo ou categoria. Operações regulares, como purgar dados do mês anterior ou carregar um lote diário, alinham-se naturalmente aos limites das partições.
Se a maioria das consultas realizar varreduras completas na tabela sem filtrar pela chave de partição, o particionamento adicionará sobrecarga sem melhorar o desempenho.
Tipos de partição
O AnalyticDB for PostgreSQL oferece suporte a três tipos de partição:
|
Tipo |
Quando usar |
|
Particionamento por intervalo |
Divida por um intervalo contínuo de valores numéricos ou de data — por exemplo, uma partição por mês para dados de séries temporais. |
|
Particionamento por lista |
Utilize uma lista explícita de valores discretos — por exemplo, uma partição por região de vendas ou categoria de produto. |
|
Partição composta |
Combine estratégias de intervalo e lista para dados multidimensionais — por exemplo, particione primeiro por ano e depois por região dentro de cada ano. |
O particionamento por intervalo aceita apenas tipos de coluna numéricos e de data/hora.
Crie uma tabela particionada
O exemplo a seguir cria uma tabela LINEITEM particionada por data de envio. Cada partição cobre um mês civil, de janeiro de 1992 a janeiro de 2000.
CREATE TABLE LINEITEM (
L_ORDERKEY BIGINT NOT NULL,
L_PARTKEY BIGINT NOT NULL,
L_SUPPKEY BIGINT NOT NULL,
L_LINENUMBER INTEGER,
L_QUANTITY FLOAT8,
L_EXTENDEDPRICE FLOAT8,
L_DISCOUNT FLOAT8,
L_TAX FLOAT8,
L_RETURNFLAG CHAR(1),
L_LINESTATUS CHAR(1),
L_SHIPDATE DATE,
L_COMMITDATE DATE,
L_RECEIPTDATE DATE,
L_SHIPINSTRUCT CHAR(25),
L_SHIPMODE CHAR(10),
L_COMMENT VARCHAR(44)
) WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576, OIDS=false)
DISTRIBUTED BY (l_orderkey)
PARTITION BY RANGE (L_SHIPDATE)
(START (date '1992-01-01') INCLUSIVE END (date '2000-01-01') EXCLUSIVE EVERY (INTERVAL '1 month'));
Principais parâmetros neste exemplo:
|
Parâmetro |
Valor |
Descrição |
|
|
|
Armazenamento orientado a colunas, otimizado para consultas analíticas |
|
|
|
Compressão zlib para reduzir o espaço de armazenamento |
|
|
|
Nível de compressão (1–9; maior = menor tamanho, gravação mais lenta) |
|
|
|
Tamanho do bloco em bytes (1 MB) |
|
|
|
Chave de distribuição para espalhar dados entre segmentos |
|
|
|
Coluna de partição — deve ser um tipo numérico ou de data/hora |
Gerencie partições
Exclua uma partição antiga
Para remover todos os dados de uma partição, exclua-a diretamente. Essa operação é muito mais rápida do que uma instrução DELETE, pois remove o armazenamento da partição sem verificar linhas individuais.
ALTER TABLE LINEITEM DROP PARTITION FOR (date '1992-01-01');
Carregue dados via troca de partição
Use o comando ALTER TABLE EXCHANGE PARTITION para adicionar uma nova partição de dados. Esse recurso permite carregar um lote de dados na tabela particionada sem executar uma gravação completa na tabela.
ALTER TABLE LINEITEM EXCHANGE PARTITION FOR (date '1999-12-01')
WITH TABLE lineitem_staging;