No PostgreSQL, o particionamento é uma estratégia eficaz para lidar com dados em crescimento contínuo, e a eliminação de partições acelera as consultas. PolarDB for PostgreSQL também oferece suporte a IMCIs em tabelas particionadas, atendendo ainda mais aos requisitos estatísticos e analíticos sobre dados particionados.
Contexto
Com a operação contínua dos sistemas de negócios, os dados históricos se acumulam e as tabelas aumentam de tamanho. Uma prática comum é particionar os dados por dimensões como tempo ou user_id, de modo que cada partição contenha apenas um subconjunto dos dados. Ao consultar esses dados, o PostgreSQL nativo também utiliza a eliminação de partições para evitar a leitura de informações irrelevantes.
Os IMCIs no PolarDB for PostgreSQL também aceleram consultas analíticas em tabelas particionadas. Você os utiliza da mesma forma que usa os índices existentes nessas tabelas.
Resultados
Com grau de paralelismo igual a 4, o IMCI foi mais de 35 vezes mais rápido que a execução paralela nativa do PostgreSQL nas três consultas de teste.
|
Consulta |
Execução paralela nativa do PostgreSQL |
IMCI |
|
Q1 |
2,13 s |
0,05 s |
|
Q2 |
6,42 s |
0,18 s |
|
Q3 |
10,51 s |
0,30 s |
Procedimento
Etapa 1: Preparar o ambiente
-
Verifique se a versão e a configuração do seu cluster atendem aos seguintes requisitos:
-
Versões do cluster:
PostgreSQL 14 (versão secundária do mecanismo 2.0.14.10.20.0 ou posterior)
PostgreSQL 15 (versão secundária do mecanismo 2.0.15.15.7.0 ou posterior)
PostgreSQL 16 (versão secundária do mecanismo 2.0.16.8.3.0 ou posterior)
PostgreSQL 17 (versão secundária do mecanismo 2.0.17.7.5.0 ou posterior)
NotaVocê pode visualizar a versão secundária do mecanismo no console ou executando a instrução
SHOW polardb_version;. Se a versão secundária do mecanismo não atender aos requisitos, atualize a versão secundária do mecanismo. -
O parâmetro
wal_leveldeve estar definido comological. Essa configuração adiciona as informações necessárias para decodificação lógica ao log write-ahead (WAL).NotaVocê pode definir o parâmetro wal_level no console. A modificação desse parâmetro reinicia o cluster. Planeje suas operações de negócios adequadamente e proceda com cautela.
A tabela source deve ter uma chave primária, e a coluna da chave primária deve ser incluída ao criar o índice columnstore. Recomenda-se usar o tipo de dados
SERIALouBIGSERIALpara a chave primária, pois isso melhora significativamente a eficiência da sincronização de dados.É possível criar apenas um índice columnstore por tabela.
-
-
Ative o recurso IMCI.
O método para ativar o IMCI varia conforme a versão secundária do mecanismo do seu cluster PolarDB for PostgreSQL:
Etapa 2: Preparar os dados
Este cenário cria uma tabela particionada em vários níveis, insere cerca de 320 milhões de linhas (~16 GB) de dados simulados e, em seguida, executa análises estatísticas com base nas condições de partição.
O schema da tabela particionada de teste é o seguinte:
sales: a tabela principal.-
sales_2023: particionada por ano.sales_2023_a: particionada por mês; os meses de 1 a 6 são definidos como partição a.sales_2023_b: particionada por mês; os meses de 7 a 12 são definidos como partição b.
-
sales_2024: particionada por ano.sales_2024_a: particionada por mês; os meses de 1 a 6 são definidos como partição a.sales_2024_b: particionada por mês; os meses de 7 a 12 são definidos como partição b.
-
Crie uma tabela particionada em vários níveis chamada
sales, com a coluna de temposale_datecomo chave de partição. A definição é a seguinte:CREATE TABLE sales ( sale_id serial, product_id int NOT NULL, sale_date date NOT NULL, amount numeric(10,2) NOT NULL, primary key(sale_id, sale_date) ) PARTITION BY RANGE (sale_date); CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-1-1') TO ('2024-1-1') PARTITION BY RANGE (sale_date); CREATE TABLE sales_2023_a PARTITION OF sales_2023 FOR VALUES FROM ('2023-1-1') TO ('2023-7-1'); CREATE TABLE sales_2023_b PARTITION OF sales_2023 FOR VALUES FROM ('2023-7-1') TO ('2024-1-1'); CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-1-1') TO ('2025-1-1') PARTITION BY RANGE (sale_date); CREATE TABLE sales_2024_a PARTITION OF sales_2024 FOR VALUES FROM ('2024-1-1') TO ('2024-7-1'); CREATE TABLE sales_2024_b PARTITION OF sales_2024 FOR VALUES FROM ('2024-7-1') TO ('2025-1-1'); -
Gere os dados e insira-os na tabela particionada (cerca de 16 GB).
INSERT INTO sales (product_id, sale_date, amount) SELECT (random()*100)::int AS product_id, '2023-01-1'::date + i/3200000*7 AS sale_date, (random()*1000)::numeric(10,2) AS amount FROM generate_series(1, 320000000) i; -
Crie um IMCI na tabela e inclua as colunas
sale_id,product_id,sale_dateeamountno IMCI.CREATE INDEX ON sales USING CSI(sale_id, product_id, sale_date, amount);
Etapa 3: Executar as consultas
Execute consultas usando diferentes mecanismos de execução. Três consultas (Q1, Q2 e Q3) são geradas com base em diferentes condições de partição.
-
Use o IMCI.
--- Enable the IMCI and set the query degree of parallelism to 4. SET polar_csi.enable_query to on; // High kernel version SET polar_csi.max_parallel_workers to 4; // Low kernel version SET polar_csi.exec_parallel to 4; --- Q1 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-3-1' AND amount > 100 GROUP BY sale_date; --- Q2 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-9-1' AND amount > 100 GROUP BY sale_date; --- Q3 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2024-3-1' AND amount > 100 GROUP BY sale_date;NotaO parâmetro
polar_csi.max_parallel_workersera anteriormente denominadopolar_csi.exec_parallelem versões anteriores do kernel. Para versões do kernel que não suportampolar_csi.max_parallel_workers, usepolar_csi.exec_parallelem seu lugar.-
PostgreSQL 14:
Use
polar_csi.exec_parallelnas versões 2.0.14.20.42.0 e anteriores.Use
polar_csi.max_parallel_workersnas versões 2.0.14.20.43.0 e posteriores.
-
PostgreSQL 16:
Use
polar_csi.exec_parallelnas versões 2.0.16.11.15.0 e anteriores.Use
polar_csi.max_parallel_workersnas versões 2.0.16.13.16.0 e posteriores.
-
-
Desative o IMCI e use o mecanismo row-store.
--- Disable the IMCI, use the row-store engine, and set the query degree of parallelism to 4. SET polar_csi.enable_query to off; SET max_parallel_workers_per_gather to 4; --- Q1 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-3-1' AND amount > 100 GROUP BY sale_date; --- Q2 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2023-9-1' AND amount > 100 GROUP BY sale_date; --- Q3 EXPLAIN ANALYZE SELECT sale_date, COUNT(*) FROM sales WHERE sale_date BETWEEN '2023-1-1' and '2024-3-1' AND amount > 100 GROUP BY sale_date;