¿Puede una sola consulta PostgreSQL usar múltiples núcleos?

57

En versiones recientes de PostgreSQL (a partir de diciembre de 2013), ¿podemos compartir una consulta entre dos o más núcleos para aumentar el rendimiento? ¿O deberíamos obtener núcleos más rápidos?

ALH
fuente

Respuestas:

49

No, para versiones de PostgreSQL anteriores a v9.6. Consulte las Preguntas frecuentes de PostgreSQL : ¿Cómo utiliza PostgreSQL los recursos de la CPU?

El servidor PostgreSQL está basado en procesos (no enhebrado). Cada sesión de base de datos se conecta a un solo sistema operativo PostgreSQL (OS) proceso . El sistema operativo distribuye automáticamente varias sesiones en todas las CPU disponibles. El sistema operativo también utiliza CPU para manejar E / S de disco y ejecutar otras tareas que no son de base de datos. Las aplicaciones cliente pueden usar hilos, cada uno de los cuales se conecta a un proceso de base de datos separado.

Desde la versión 9.6, partes de algunas consultas se pueden ejecutar en paralelo, en procesos separados del sistema operativo, lo que permite el uso de múltiples núcleos de CPU. Las consultas paralelas están habilitadas de forma predeterminada en la versión 10 (max_parallel_workers_per_gather), con paralelismo adicional esperado en futuras versiones.

Jayadevan
fuente
38

PostgreSQL 9.6+ en adelante, comenzaría a ver Parallel-Query finalmente llegando a PostgreSQL.

Por ejemplo, conceptos como recorrido paralelo / Paralelo Únete / Agregados paralelos están ahora ya se cuecen en, con más por venir pronto.

Lo que es realmente emocionante es que hay informes que confirman near-linear speed-upen algunos casos, ¡lo cual es bastante impresionante!

Robins Tharakan
fuente
3

No. Cada conexión genera un proceso separado en el servidor.

Puede "emular" cierto paralelismo utilizando un lenguaje procesal roscado como pljava. Cree un procedimiento (función) de Java que inicie varios subprocesos y cree el resultado de salida utilizando varios trabajadores. El backend está sincronizado para que cada trabajador pueda actualizar la salida de forma asincrónica.

Java tiene un buen soporte para la coordinación / cooperación de hilos.

Como ejemplos, esto sería bueno para operaciones intensivas de CPU u operaciones de longitud de red.

cavila
fuente