Agg: Parallele Aggregierungen für PostgreSQL

Bisher konnte PostgreSQL eine Query nur auf einem CPU Core ausführen. Bei größeren Aggregierungen kann das zu Limitierungen führen. „agg“ löst genau dieses Problem und ist in der Lage, Aggregierungen auf mehrere CPUs aufzuteilen und parallel laufen zu lassen.

Features:

  • Parallele Aggregierung (sum, min, max, count, etc.)
  • Support für die FILTER-Clause
  • Support für Constraint Exclusion (jede Partition läuft auf einem eigenen CPU Core)
  • Einfache Installation
  • Funktioniert mit PostgreSQL 9.5 oder höher

Signifikant bessere Laufzeiten:

Unsere Tests haben bei vielen Workloads eine signifikant verbesserte Laufzeit gezeigt. Bei vielen Abfragen ist speziell die Aggregierung ein massiver Bottleneck, der mit „agg“ gut umschifft werden kann. Operationen wie CASE / WHEN schlucken auf PostgreSQL viel CPU und können daher von mehreren Cores massiv profitieren. „agg“ ermöglicht genau das ohne viel
Zutun. Die Skalierung auf viele CPU Cores schafft entsprechende Abhilfe.

Auf unseren Testsystemen haben wir Verbesserungen um Faktor 30 und mehr erlebt. Speziell komplexere Abfragen profitieren enorm von vielen Cores. Viele Operationen lassen sich mit „agg“ fast linear beschleunigen.

„agg“ ist ideal, um Analytics und Aggregierungen zu beschleunigen.
Dabei muss der SQL Code nicht angepasst werden. „agg“ ist vollkommen transparent.

Folie3

Installation:

Agg kann gratis von unserer Website downgeloaded werden und steht unter der PostgreSQL Lizenz zur Verfügung. (Download Link unten am Ende dieser Seite)

Um das Package zu installieren, sind die folgenden Schritte nötig:

tar xvfz agg-1.0beta1.tar.gz

In weiterer Folge muss PG_CONFIG auf den korrekten Pfad angepasst werden:

export PG_CONFIG=/path_to_postgres/bin/pg_config

Dann kann das Modul bereits kompiliert werden:

cd src
make install.

„agg“ kann in PostgreSQL als Modul geladen werden. Das passiert beim Start des Servers. Um „agg“ zu laden, muss „agg.so“ zu shared_preload_libraries in postgresql.conf hinzu gefügt werden:

shared_preload_libraries = 'agg.so'

Starten Sie PostgreSQL neu und aktivieren Sie agg

CREATE EXTENSION agg;

PostgreSQL wird das Modul nun beim Start laden und versuchen, Ihre Abfragen zu skalieren.

Agg testen:

Um „agg“ zu testen können Sie eine einfache Testtabelle anlegen:

CREATE TABLE t_test (id serial, name test);
CREATE TABLE t_test_1 () INHERITS (t_test);
CREATE TABLE t_test_2 () INHERITS (t_test);

INSERT INTO t_test_1 (name) SELECT 'hans'
FROM generate_series(1, 10000000);
INSERT INTO t_test_2 (name) SELECT 'paul'
FROM generate_series(1, 10000000);

Das Modul kann nun getestet werden:

\timing (in case you are using psql)
SELECT name, count(*)
FROM t_test
GROUP BY 1;

Um „agg“ zu aktivieren, muss die Anzahl der Worker Prozesse definiert werden. Das funktioniert so:

SET agg.hash_workers = 4; # um 4 Cores zu verwenden

Wenn agg.hash_workers auf 0 gesetzt ist, ist das Modul deaktiviert. Ist das Setting auf 1, versucht „agg“ einen Worker Prozess zu verwenden. Sind mehr Cores konfiguriert, gibt es eine entsprechend bessere Skalierung.

Hinweis: Setzen Sie max_worker_processes in postgresql.conf auf einen entsprechend hohen Wert, um sicherzustellen, dass „agg“ entsprechend viele Worker Prozesse zur Verfügung hat.

test=# SHOW max_worker_processes ;
max_worker_processes
----------------------
100
(1 row)

AGG description 1

Was „agg“ für Sie tun kann:

„agg“ kann viele Abfragen parallel laufen lassen:

  • Einfache Aggregierungen: GROUP BY, HAVING
  • FILTER-clauses
  • Partitionierte Tabellen
  • Das Lesen einzelner Tabellen

„agg“ ist nicht in der Lage, die folgenden Abfragen zu skalieren:

  • Index scans
  • Sortierung
  • Joins
  • Custom aggregates
  • VACUUM, CREATE INDEX, etc
  • Grouping Sets (CUBE, ROLLUP, etc.) werden derzeit nicht unterstützt

„agg“ wurde speziell für große Aggregierungen entwickelt. Dabei arbeitet „agg“ zwischen dem Optimizer und dem Executor. „Plan nodes“ werden dabei von „agg“ durch entsprechend optimierte Routinen ersetzt und skaliert. Wenn „agg“ keinen passenden Plan vorfindet, nimmt „agg“ keine Veränderungen vor und die Abfrage arbeitet wie gehabt – „agg“ bleibt daher zu jedem Zeitpunkt vollkommen transparent. Wenn „agg“ Möglichkeiten der Skalierung vorfindet, werden zahlreiche Worker Prozesse verwendet, um möglichst viele CPU Cores an der Arbeit zu beteiligen.

Als generelle Richtlinie könnte man sagen: Je komplexer eine Aggregierung ist, umso besser kann skaliert werden. Komplexe SELECT-Clauses mit vielen Aggregationsfunktionen scheinen dabei besonders zu profitieren. Gleiches gilt für möglichst komplexe GROUP BY Operationen.

Performance Optimierung:

Große shared_buffer Settings scheinen für „agg“ sehr vorteilhaft zu sein und wir haben damit gute Ergebnisse und eine wesentlich linearere Skalierung erreicht. Es ist vorteilhaft, einen höheren Wert für shared_buffers als allgemein üblich zu verwenden.

Es ist generell eine gute Idee, agg.hash_workers auf einen Wert zu setzen, der in etwa der Anzahl der Partitionen einer partitionierten Tabelle entspricht. Alternativ dazu kann eine Zahl verwendet werden, die einem Vielfachen entspricht.

„agg“ kann auch verwendet werden, um das Lesen einer einzelnen Tabelle zu optimieren. Dabei wird die Tabelle von einem Mutterprozess gelesen. Der Inhalt wird mit Hilfe einer Shared Memory Queue an die Worker Prozesse verteilt. Ist die Query einfach, bringt das kaum Vorteile – wenn eine Abfrage jedoch zig Aggregierungsfunktionen enthält, bringt das massive Performancevorteile.

Tests haben gezeigt, dass die Zeit, die PostgreSQL für das Planen der Query benötigt, leicht steigt, wenn „agg“ aktiv ist. Dieser Overhead ist bei analytischen Fragen jedoch absolut vernachlässigbar und stellt kein Problem dar.

Die Verwendung von „Synchronized Seqscans“ wirkt sich sehr positiv auf „agg“ aus. Wenn mehrer Abfragen auf die selben Tabellen gleichzeitig „agg“ verwenden, lässt sich dadurch ein I/O Bottleneck gezielt vermeiden.

Folie2

Unterstützte Versionen von PostgreSQL:

Aktuell wird PostgreSQL 9.5 unterstützt.
Zukünftige Versionen werden von „agg“ unterstützt.
Ältere Versionen von PostgreSQL werden nicht unterstützt.

24×7 support:

Wenn Sie „agg“ im produktiven Umfeld verwenden möchten, stellt die Cybertec Schönig & Schönig GmbH professionellen 24×7 Support zur Verfügung. Wir bieten Bugfixes, Consulting, Training sowie Expertise und Unterstützung zur Verfügung.
Kontaktieren Sie uns!

Lizenz:

„agg“ ist unter der PostgreSQL Lizenz verfügbar.

Download:

Bitte füllen Sie das Formular aus, wir schicken Ihnen den Download Link per Email zu!


Ihr Name (Pflichtfeld)

Ihre E-Mail-Adresse (Pflichtfeld)