A utilização da execução paralela para a parte SELECT de uma consulta INSERT INTO ... SELECT
pode melhorar o desempenho das consultas do AlloyDB for PostgreSQL, especialmente
para tabelas particionadas e consultas complexas.
Ao paralelizar o subplano SELECT, a base de dados usa vários processos de trabalho para obter dados. Em seguida, a base de dados insere os dados obtidos na tabela de destino. Esta divisão do trabalho pode levar a melhorias no desempenho da base de dados.
Como funcionam os planos de consultas paralelas no PostgreSQL
No PostgreSQL, o otimizador de consultas pode criar um plano paralelo para uma consulta inteira ou parte de uma consulta. Quando é gerado um plano paralelo, é adicionado um nó Gather
ou Gather Merge à parte superior do plano.
Este nó coordena vários processos de trabalho paralelos. Cada trabalhador executa uma parte da tarefa, por exemplo, analisar uma parte de uma tabela. O nó Gather recolhe os resultados de todos os trabalhadores e transmite-os à fase seguinte da consulta ou de volta ao cliente.
Por exemplo, o plano de consulta seguinte mostra um nó Gather que planeia usar
cinco processos de trabalho para uma análise sequencial paralela na tabela t1.
EXPLAIN SELECT * FROM t1;
QUERY PLAN
-------------------------------------------------------------
Gather (cost=0.00..143359.76 rows=9999878 width=60)
Workers Planned: 5
-> Parallel Seq Scan on t1 (cost=0.00..143359.76 rows=1999976 width=60)
(3 rows)
Execução paralela para declarações INSERT...SELECT
O AlloyDB melhora o INSERT INTO ... SELECTdesempenho usando
vários processos de trabalho para paralelizar a declaração SELECT.
Esta divisão do trabalho pode levar a melhorias no desempenho da base de dados.
A consulta tem de ser segura para execução em paralelo e não podem existir condições que impeçam a paralelização.
Muitas operações de base de dados usam declarações INSERT INTO ... SELECT para adicionar novas linhas a uma tabela. Muitas vezes, a parte SELECT da declaração é a parte da consulta que requer mais recursos.
A funcionalidade é controlada pelos seguintes parâmetros de configuração:
enable_parallel_select_for_insert_select: ativa ou desativa a funcionalidade . Este parâmetro está ativado por predefinição no PostgreSQL 14 e posterior.enable_parallel_select_for_insert_select_into_part_table: ativa ou desativa a funcionalidade que lhe permite inserir dados em tabelas particionadas. Este parâmetro está desativado por predefinição no PostgreSQL 16 e versões posteriores.
Para que o planeador de consultas considere um plano paralelo, a declaração tem de ser segura para execução paralela.INSERT SELECT Isto significa que nenhuma parte da operação pode conter funções ou expressões que não possam ser executadas em paralelo com segurança. Se
qualquer parte da consulta for considerada não segura para execução em paralelo, o otimizador recorre
a um plano não paralelo. Para mais informações, consulte o artigo
parallel-safety.
Condições que impedem a execução em paralelo
O otimizador de consultas não usa um plano paralelo se a declaração INSERT SELECT
for considerada não segura para execução em paralelo. As seguintes condições impedem a paralelização:
- A tabela de destino é uma tabela externa.
- A consulta usa uma expressão de tabela comum (CTE) modificável que contém uma declaração de modificação de dados, por exemplo,
DELETE. - Um índice na tabela de destino usa uma expressão ou uma função não segura paralela.
- Uma coluna na tabela de destino tem um valor predefinido que usa uma função não segura paralela.
- Um acionador na tabela de destino usa uma expressão ou uma função não segura paralela.
- A tabela de destino tem uma coluna DOMAIN com uma restrição
CHECKque usa uma função não segura paralela. - Uma restrição
CHECKna tabela de destino contém uma expressão ou uma função não segura paralela. - A tabela de destino é uma tabela particionada e a opção
enable_parallel_select_for_insert_select_into_part_tableestá desativada.
Antes de começar
Este documento pressupõe que tem uma base de dados do AlloyDB. Para criar uma base de dados, consulte os artigos Crie um cluster e a respetiva instância principal e Crie e faça a gestão de uma base de dados.
Funções necessárias
Para receber as autorizações necessárias para alterar as flags da base de dados ao nível da sessão, peça ao seu administrador para lhe conceder a função de gestão de identidades e acessos (IAM) de utilizador da base de dados do AlloyDB (roles/alloydb.databaseUser) no seu projeto. Para mais informações sobre a atribuição de funções, consulte o artigo
Faça a gestão do acesso a projetos, pastas e organizações.
Ative os parâmetros de execução paralela
Para ativar a execução em paralelo para tabelas de destino particionadas, siga estes passos:
Na Google Cloud consola, aceda à página Clusters.
Selecione um cluster na lista.
No menu de navegação, clique em AlloyDB Studio.
Inicie sessão no AlloyDB Studio com o nome da base de dados, nome de utilizador e palavra-passe.
Defina o GUC
enable_parallel_select_for_insert_select_into_part_tablecomoon.SET enable_parallel_select_for_insert_select_into_part_table = on;Depois de ativar o parâmetro GUC, o planeador de consultas considera automaticamente planos paralelos para declarações
INSERT INTO ... SELECTem que o alvo é uma tabela particionada, desde que a consulta seja considerada segura para paralelização.O exemplo seguinte resulta num plano EXPLAIN que mostra um nó Gather, o que indica que o
SELECTdesource_tableé executado em paralelo.-- Create a partitioned table CREATE TABLE part_table (a INT, b TEXT) PARTITION BY RANGE (a); CREATE TABLE part_table_1 PARTITION OF part_table FOR VALUES FROM (MINVALUE) TO (1000); CREATE TABLE part_table_2 PARTITION OF part_table FOR VALUES FROM (1000) TO (MAXVALUE); -- Create a source table CREATE TABLE source_table (c1 INT, c2 TEXT); INSERT INTO source_table SELECT i, 'value_' || i FROM generate_series(1, 2000) i; ANALYZE source_table; -- Enable the feature SET enable_parallel_select_for_insert_select_into_part_table = on; -- Optional for parallelizing the query with a small amount of data SET parallel_setup_cost=0; SET parallel_tuple_cost=0; SET min_parallel_table_scan_size=0; -- Run the insert with a parallelizable select EXPLAIN INSERT INTO part_table SELECT * FROM source_table;Isto devolve o seguinte resultado:
EXPLAIN (COSTS OFF) INSERT INTO part_table SELECT * FROM source_table; QUERY PLAN ----------------------------------------------- Insert on part_table -> Gather Workers Planned: 2 -> Parallel Seq Scan on source_table (4 rows)
Desative os parâmetros de execução paralela
Para desativar os parâmetros, siga estes passos:
Na Google Cloud consola, aceda à página Clusters.
Selecione um cluster na lista.
No menu de navegação, clique em AlloyDB Studio.
Inicie sessão no AlloyDB Studio com o nome da base de dados, nome de utilizador e palavra-passe.
Para desativar o parâmetro
enable_parallel_select_for_insert_select, execute o seguinte comando SQL:SET enable_parallel_select_for_insert_select = OFF;Para desativar o parâmetro
enable_parallel_select_for_insert_select_into_part_table, execute o seguinte comando SQL:SET enable_parallel_select_for_insert_select_into_part_table = OFF;
Valide um plano paralelo
Pode verificar se o otimizador está a usar um plano paralelo com o comando EXPLAIN. Procure um nó Gather e os atributos Workers Planned ou Workers Launched no plano de consulta.
Exemplo de tabela padrão
No exemplo de plano seguinte, são iniciados seis processos de trabalho para uma junção hash paralela para executar a declaração SELECT.
EXPLAIN (ANALYZE)
INSERT INTO t1 SELECT t2.* FROM t1, t2 WHERE t1.c1 != t2.c1 AND t1.c2 = t2.c2;
QUERY PLAN
------------------------------------------------------------------------------------
Insert on t1 (cost=1209138.00..12801765.49 rows=0 width=0) (actual time=16812.677..19337.150 rows=0 loops=1)
-> Gather (cost=1209138.00..12801765.49 rows=99995407 width=24) (actual time=16812.674..19337.144 rows=0 loops=1)
Workers Planned: 6
Workers Launched: 6
-> Parallel Hash Join (...)
(...)
Exemplo de tabela particionada
O exemplo seguinte mostra que, depois de ativar a funcionalidade para tabelas
particionadas, o plano mostra um nó Gather com quatro trabalhadores planeados para a
SELECT.
-- First, enable the feature for partitioned tables
SET enable_parallel_select_for_insert_select_into_part_table = ON;
-- Then, explain the query
EXPLAIN (COSTS OFF) INSERT INTO part_table SELECT * FROM source_table;
QUERY PLAN
-----------------------------------------------
Insert on part_table
-> Gather
Workers Planned: 2
-> Parallel Seq Scan on source_table
(4 rows)
O que se segue?
- Saiba mais sobre a segurança paralela.