AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 344786
Accepted
Purushottam Nawale
Purushottam Nawale
Asked: 2025-01-18 05:04:15 +0800 CST2025-01-18 05:04:15 +0800 CST 2025-01-18 05:04:15 +0800 CST

Como garantir que uma consulta seja executada em paralelo no PostgreSQL?

  • 772

Tenho um banco de dados PostgreSQL 16 configurado com a seguinte configuração:

-- DB Version: 16
-- OS Type: linux
-- DB Type: oltp
-- Total Memory (RAM): 64 GB
-- CPUs num: 32
-- Connections num: 200
-- Data Storage: ssd

show effective_cache_size; --48 GB
show effective_io_concurrency; --200
show huge_pages; --try
show maintenance_work_mem; --4GB
show max_connections; --200
show max_parallel_maintenance_workers; --4
show max_parallel_workers; --32
show max_parallel_workers_per_gather; --4
show max_wal_size; --8GB
show max_worker_processes; --32
show min_wal_size; --2GB
show parallel_setup_cost; --0.1
show random_page_cost; --1.1
show shared_buffers; --16GB
show wal_buffers; --16MB
show work_mem; --256MB

Estou executando uma CREATE TABLEconsulta com múltiplas junções. Às vezes, a consulta é executada em paralelo, mas outras vezes não. Quero garantir que a consulta seja executada em paralelo ou, pelo menos, aumentar as chances de ela ser executada em paralelo para aquela sessão de transação específica. Também é bom se os trabalhadores paralelos atribuídos forem menos do que o normal, porque sem trabalhadores paralelos a consulta é muito lenta.

A configuração abaixo funcionou melhor para mim por algum tempo, mas causou um erro semelhante a este problema .

ALTER SYSTEM SET maintenance_work_mem = '8GB';
ALTER SYSTEM SET work_mem = '2GB';
ALTER SYSTEM SET effective_io_concurrency = '400';
ALTER SYSTEM SET max_parallel_workers_per_gather = '16';
ALTER SYSTEM SET wal_buffers = '1GB';

Estou anexando um plano de consulta selecionado para referência: plano de consulta .

Quero maximizar a utilização da CPU (atualmente menos de 10%) e a utilização da RAM (atualmente menos de 30%).

Estou ciente de que force_parallel_modefoi descontinuado. Como posso obter execução paralela consistente para minhas consultas no PostgreSQL?

postgresql
  • 3 3 respostas
  • 287 Views

3 respostas

  • Voted
  1. Laurenz Albe
    2025-01-18T15:38:54+08:002025-01-18T15:38:54+08:00

    Você não deve forçar o PostgreSQL a usar consulta paralela. Em vez disso, diga a ele que ele pode usar muitos processos de trabalho paralelos para sua consulta se ele achar que um plano paralelo vencerá:

    1. Você pode substituir a heurística do PostgreSQL para determinar o número de trabalhadores paralelos para varreduras de uma determinada tabela:

      ALTER TABLE tab SET (parallel_workers = 16);
      
    2. Você pode diminuir min_parallel_table_scan_sizee min_parallel_index_scan_sizefazer com que a heurística do PostgreSQL escolha mais processos de trabalho paralelos.

    • 4
  2. Erwin Brandstetter
    2025-01-18T11:30:17+08:002025-01-18T11:30:17+08:00

    Na verdade, force_parallel_modefoi renomeado apenas para debug_parallel_queryno Postgres 16. As notas de lançamento :

    Renomear variável do servidor force_parallel_modepara debug_parallel_query (David Rowley)

    Você pode usar essa configuração para forçar o modo paralelo. Somente na sua sessão:

    SET debug_parallel_query = on;
    

    Como o novo nome sugere, ele é realmente usado para depuração, porque você pode forçar o Postgres a adotar um plano de consulta ruim.

    Além disso, com essa configuração, o Postgres planejará um Gathernó sempre que possível, mas só usará trabalhadores paralelos se algum estiver disponível no momento da execução.

    • 3
  3. Best Answer
    jjanes
    2025-01-22T02:07:07+08:002025-01-22T02:07:07+08:00

    As duas respostas que você já tem estão, em sua maioria, corretas. Você pode usar debug_parallel_query, mas é uma maneira um tanto extrema de fazer isso e pode resultar no uso de planos paralelos, mesmo quando eles são realmente mais lentos. Nas minhas mãos, fazer isso geralmente resultará em um plano bobo que é "Cópia Única" e inicia apenas um trabalhador e faz com que esse trabalhador faça todo o trabalho (sem participação do líder).

    Definir parallel_workers em uma tabela não mudará (até onde eu sei) se um plano paralelo é escolhido, mas apenas mudará quantos workers são iniciados se um plano paralelo for escolhido, então isso provavelmente não ajudará você. Alterar min_parallel_table_scan_size e min_parallel_index_scan_size ajudará você somente se essas forem as razões específicas pelas quais você não está obtendo planos paralelos, o que, com base na sua descrição, suspeito que não seja o caso (ajudaria ver um plano EXPLAIN para o caso em que ele escolhe não usar consulta paralela).

    O botão mais poderoso que você tem aqui é parallel_tuple_cost. Definir como zero seria um pouco extremo (mas não tanto quanto usar debug_parallel_query). Costumo defini-lo como zero ao testar, se quiser encorajar um plano paralelo para ver o que vai acontecer. Mas eu provavelmente não faria isso em produção. Acho que o valor mínimo sensato para isso é cerca de 0,01 (um décimo do padrão) e é com isso que eu começaria na sua situação, onde você já sabe que a consulta paralela está sendo subutilizada.

    A configuração correta para isso vai depender do uso do seu servidor. Se apenas uma conexão de banco de dados provavelmente estiver ativa por vez, então qualquer CPU não usada para essa conexão será desperdiçada, então essa situação justifica as configurações mais baixas para cpu_tuple_cost. Por outro lado, se o servidor estiver muito ocupado, de modo que muitas sessões estejam ativas ao mesmo tempo e lutem pela CPU, usar a consulta paralela só fará com que elas lutem mais, o que sugeriria uma configuração mais alta para cpu_tuple_cost (ou, no extremo, apenas alterar max_parallel_workers_per_gather=0 para desabilitar a consulta paralela completamente).

    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve