Nas versões recentes do PostgreSQL (em dezembro de 2013), podemos compartilhar uma consulta entre dois ou mais núcleos para obter um aumento no desempenho? Ou devemos obter núcleos mais rápidos?
Nas versões recentes do PostgreSQL (em dezembro de 2013), podemos compartilhar uma consulta entre dois ou mais núcleos para obter um aumento no desempenho? Ou devemos obter núcleos mais rápidos?
Não, para versões do PostgreSQL anteriores à v9.6. Consulte as Perguntas frequentes do PostgreSQL : Como o PostgreSQL usa os recursos da CPU?
O servidor PostgreSQL é baseado em processo (não encadeado). Cada sessão de banco de dados se conecta a um único sistema operacional PostgreSQL (OS) processo . Várias sessões são automaticamente distribuídas por todas as CPUs disponíveis pelo sistema operacional. O sistema operacional também usa CPUs para manipular E / S de disco e executar outras tarefas que não são do banco de dados. Os aplicativos clientes podem usar threads, cada um dos quais se conecta a um processo de banco de dados separado.
Desde a versão 9.6, partes de algumas consultas podem ser executadas em paralelo, em processos separados do sistema operacional, permitindo o uso de vários núcleos da CPU. As consultas paralelas são ativadas por padrão na versão 10 (max_parallel_workers_per_gather), com paralelismo adicional esperado em versões futuras.
O PostgreSQL 9.6+ em diante, começaria a ver o Parallel-Query finalmente chegando ao PostgreSQL.
Por exemplo, conceitos como Varredura Paralela / Junção Paralela / Agregados Paralelos já estão prontos, com mais por vir em breve.
O que é realmente empolgante é que existem relatórios confirmando near-linear speed-up
em alguns casos, o que é bastante impressionante!
Não, mas existe uma solução alternativa. :)
Encontrei a função plpgsql do parsel (seleção paralela), que divide sua consulta com base na chave primária, depois se conecta ao banco de dados via extensão dblink e aguarda todas as subconsultas.
https://gist.github.com/mjgleaso/8031067
O autor também escreveu artigo sobre esta função: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html
Não. Cada conexão gera um processo separado no servidor.
Você pode "emular" algum paralelismo usando uma linguagem processual encadeada como pljava. Crie um procedimento java (função) que inicie vários threads e crie o resultado de saída usando vários trabalhadores. O back-end é sincronizado para que cada trabalhador possa atualizar a saída assíncrona.
Java possui um bom suporte para coordenação / cooperação de encadeamentos.
Como exemplos, isso seria bom para operações intensivas da CPU ou operações de comprimento de rede.