Use a instrução CREATE PARTITION TABLE para dividir uma tabela em tabelas filhas com base em uma coluna de chave de partição. O sistema particiona a tabela pai em diferentes tabelas filhas conforme os valores da chave de partição. Os dados nas tabelas filhas ficam acessíveis publicamente. Cada tabela filha armazena linhas referentes a um valor específico de partição. Para consultar dados em uma tabela particionada, especifique a partição desejada. Assim, o sistema ignora as partições não correspondentes e reduz o volume de dados verificados.
Neste tópico, "tabela pai" refere-se a uma tabela particionada pai e "tabela filha" refere-se a uma tabela particionada filha.
Quando usar tabelas particionadas
Adote tabelas particionadas quando os benefícios da eliminação de partições ou das operações de dados em massa superarem claramente a sobrecarga de gerenciar múltiplas tabelas filhas.
Use tabelas particionadas quando:
O volume diário de dados de uma única partição ultrapassar 100 milhões de linhas (para particionamento baseado em data).
Você precisar substituir ou excluir em massa todos os dados de uma partição inteira usando
TRUNCATEouDROP. Ambas as operações são concluídas instantaneamente em uma tabela filha e evitam varreduras completas.
Evite tabelas particionadas quando:
A source de dados for um sistema de banco de dados. Partições excessivas desperdiçam recursos de I/O. Nesse caso, defina as colunas de filtro mais utilizadas como chave de segmento para ative a aceleração de consultas baseada em índice.
O volume diário de dados for inferior a 100 milhões de linhas por partição. Partições pequenas oferecem aceleração de consulta insignificante. Prefira uma granularidade maior.
Lembre-se: cada tabela filha é armazenada como um conjunto separado de arquivos e equivale a uma tabela não particionada no armazenamento de metadados. Um grande número de tabelas filhas aumenta o volume de metadados e gera muitos arquivos pequenos e fragmentos.
Limitações
-
Grave os dados em uma tabela filha, e não diretamente na tabela pai.
O Realtime Compute for Apache Flink pode gravar dados em uma tabela pai em tempo real. Para obter detalhes, consulte Gravar dados em uma tabela sink particionada do Hologres em tempo real .
O Hologres suporta apenas particionamento por lista (
PARTITION BY LIST).A chave de partição deve ser uma única coluna.
Cada regra de particionamento permite criar apenas uma tabela particionada.
Se a tabela pai possuir uma chave primária, a coluna da chave de partição deverá fazer parte dessa chave primária.
Criar uma tabela particionada
Uma tabela particionada consiste em uma tabela pai (que define o esquema e a regra de partição) e uma ou mais tabelas filhas (cada uma abrangendo valores específicos de partição). Crie as tabelas filhas antes de gravar os dados.
Como alternativa, ative o particionamento dinâmico para permitir que o Hologres crie tabelas filhas automaticamente com base nas regras configuradas.
Sintaxe
-- Create the parent table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> (
{
<column_name> <column_type> [<column_constraints> [, ...]]
| <table_constraints>
[, ...]
}
)
PARTITION BY LIST (<column_name>);
-- Create a child table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name>
PARTITION OF <parent_table>
FOR VALUES IN (<string_literal>);
Parâmetros
|
Parâmetro |
Descrição |
|
|
Suprime o erro caso já exista uma tabela com o mesmo nome. |
|
|
O esquema que contém a tabela. Omita se as tabelas pai e filha estiverem no mesmo esquema; obrigatório para criação entre esquemas diferentes. |
|
|
O nome da tabela pai ou filha a ser criada. |
|
|
O nome da coluna. |
|
|
O tipo de dados da coluna. |
|
|
Restrições no nível da coluna (por exemplo, |
|
|
Restrições no nível da tabela (por exemplo, |
|
|
O nome da tabela pai à qual a tabela filha pertence. |
|
|
O valor da chave de partição para a tabela filha. |
Tipos de dados suportados para colunas de chave de partição:
|
Tipo de dado |
Versões suportadas |
|
|
Todas as versões |
|
|
Todas as versões |
|
|
Todas as versões |
|
|
Hologres V1.3.22 e posteriores |
Exemplos
Os exemplos a seguir criam uma tabela de fatos particionada em que cada tabela filha armazena os dados de um dia. Esse é um padrão comum para truncar ou substituir eficientemente um dia inteiro de dados.
Exemplo 1: Tabela pai sem chave primária
As duas variantes de sintaxe são equivalentes. Use a sintaxe V2.1+ se a sua versão do Hologres oferecer suporte.
Hologres V2.1 e posteriores:
BEGIN;
CREATE TABLE public.hologres_parent (
a TEXT,
b INT,
c TIMESTAMP,
d TEXT
)
PARTITION BY LIST (a)
WITH (orientation = 'column');
CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN ('v1');
CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN ('v2');
CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN ('v3');
COMMIT;
Todas as versões do Hologres:
BEGIN;
CREATE TABLE public.hologres_parent(
a TEXT,
b INT,
c TIMESTAMP,
d TEXT
)
PARTITION BY LIST(a);
CALL set_table_property('public.hologres_parent', 'orientation', 'column');
CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN('v1');
CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN('v2');
CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN('v3');
COMMIT;
Exemplo 2: Tabela pai com chave primária
Ao definir uma chave primária, inclua a coluna da chave de partição (ds neste exemplo) nessa chave.
Hologres V2.1 e posteriores:
BEGIN;
CREATE TABLE public.hologres_parent_2 (
a TEXT,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY (ds, b)
)
PARTITION BY LIST (ds)
WITH (orientation = 'column');
CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201215');
CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201216');
CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201217');
COMMIT;
Todas as versões do Hologres:
BEGIN;
CREATE TABLE public.hologres_parent_2(
a TEXT,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY (ds, b)
)
PARTITION BY LIST(ds);
CALL set_table_property('public.hologres_parent_2', 'orientation', 'column');
CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201215');
CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201216');
CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201217');
COMMIT;
Listar tabelas filhas
Liste todas as tabelas filhas de uma tabela pai usando o HoloWeb ou a seguinte instrução SQL. Substitua parent_table_name pelo nome real da tabela pai.
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname = 'parent_table_name';
Regras de herança de propriedades
Ao criar uma tabela filha usando CREATE TABLE ... PARTITION OF, ela herda a maioria das propriedades da tabela pai. A tabela abaixo mostra quais propriedades devem corresponder e quais podem diferir.
Devem corresponder: Anexar uma tabela filha com um valor diferente para essas propriedades resulta em erro. Para evitar isso, crie tabelas filhas usando CREATE TABLE LIKE, que copia as configurações de propriedade da tabela pai.
Podem diferir: Se não forem definidas explicitamente na tabela filha, ela herdará o valor da tabela pai. Caso sejam definidas explicitamente, o valor da tabela filha terá efeito.
Devem incluir as colunas indexadas da tabela pai: As colunas indexadas da tabela filha devem ser um superconjunto das colunas da tabela pai. É possível adicionar colunas indexadas adicionais na tabela filha.
|
Categoria |
Propriedade |
Herdada da tabela pai |
Regra ao anexar |
|
Propriedade da tabela |
|
Sim |
Deve corresponder |
|
Propriedade da tabela |
|
Sim |
Deve corresponder |
|
Propriedade da tabela |
|
Sim |
Pode diferir |
|
Índice |
Chave primária |
Sim |
Deve corresponder |
|
Índice |
|
Sim |
Deve corresponder |
|
Índice |
|
Sim |
Deve corresponder |
|
Índice |
|
Sim |
Deve corresponder |
|
Índice |
|
Sim |
Pode diferir |
|
Índice |
|
Sim |
Pode diferir |
|
Índice |
|
Sim |
Deve corresponder |
|
Índice |
|
Sim |
Deve corresponder |
|
Restrição de coluna |
|
Sim |
Deve corresponder |
|
Restrição de coluna |
Valor padrão |
Sim |
Deve corresponder |
Próximos passos
Particionamento dinâmico — crie e gerencie tabelas filhas automaticamente com base em regras configuradas, sem precisar criar cada partição manualmente com antecedência.
ALTER PARTITION TABLE — modifique partições após a criação.
DROP PARTITION TABLE — exclua tabelas particionadas.