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?
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?
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.
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-up
en algunos casos, ¡lo cual es bastante impresionante!
No, pero hay una solución alternativa. :)
Encontré la función plpgsql parsel (selección paralela), que divide su consulta en función de la clave primaria, luego se conecta a la base de datos a través de la extensión dblink y espera todas las subconsultas.
https://gist.github.com/mjgleaso/8031067
El autor también escribió un artículo sobre esta función: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html
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.