Kann eine einzelne PostgreSQL-Abfrage mehrere Kerne verwenden?

57

Können wir in neueren Versionen von PostgreSQL (Stand: Dezember 2013) eine Abfrage zwischen zwei oder mehr Kernen gemeinsam nutzen, um eine Leistungssteigerung zu erzielen? Oder sollten wir schnellere Kerne bekommen?

ALH
quelle

Antworten:

49

Nein, für PostgreSQL-Versionen vor Version 9.6. Weitere Informationen finden Sie in den PostgreSQL-FAQ : Wie verwendet PostgreSQL CPU-Ressourcen?

Der PostgreSQL-Server ist prozessbasiert (ohne Threading). Jede Datenbanksitzung einer Verbindung zu einem einzigen PostgreSQL Betriebssystem (OS) Prozess . Das Betriebssystem verteilt automatisch mehrere Sitzungen auf alle verfügbaren CPUs. Das Betriebssystem verwendet auch CPUs, um die Datenträger-E / A zu verarbeiten und andere Nicht-Datenbank-Tasks auszuführen. Clientanwendungen können Threads verwenden, von denen jeder eine Verbindung zu einem separaten Datenbankprozess herstellt.

Seit Version 9.6 können Teile einiger Abfragen in separaten Betriebssystemprozessen parallel ausgeführt werden, sodass mehrere CPU-Kerne verwendet werden können. Parallele Abfragen sind in Version 10 (max_parallel_workers_per_gather) standardmäßig aktiviert. In zukünftigen Versionen wird eine zusätzliche Parallelität erwartet.

Jayadevan
quelle
38

Ab PostgreSQL 9.6 und höher würde Parallel-Query endlich auch für PostgreSQL verfügbar sein .

Zum Beispiel sind Konzepte wie Paralleler Scan / Paralleler Join / Parallele Aggregate bereits integriert, weitere werden in Kürze folgen.

Was wirklich aufregend ist, ist, dass es Berichte gibt , die near-linear speed-upin einigen Fällen bestätigen, was ziemlich beeindruckend ist!

Rotkehlchen Tharakan
quelle
3

Nein. Jede Verbindung erzeugt einen separaten Prozess auf dem Server.

Sie können eine Parallelität mit einer Thread-Prozedur-Sprache wie pljava "emulieren". Erstellen Sie eine Java-Prozedur (Funktion), die mehrere Threads startet, und erstellen Sie das Ausgabeergebnis mit mehreren Workern. Das Backend ist synchronisiert, sodass jeder Worker die Ausgabe asynchron aktualisieren kann.

Java bietet eine gute Unterstützung für die Thread-Koordination / -Kooperation.

Dies ist beispielsweise für CPU-intensive Vorgänge oder Vorgänge mit Netzwerklänge hilfreich.

cavila
quelle