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.

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:


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


Dann kann das Modul bereits kompiliert werden:


„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 hinzugefügt werden:

Starten Sie PostgreSQL neu und aktivieren Sie 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:


Das Modul kann nun getestet werden:


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


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 viele Worker Prozesse zur Verfügung hat.

Agg Download

Laden Sie Agg kostenlos herunter.

Download agg-1.0.tgz_.zip

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.

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!

Kontaktieren Sie uns!

Lizenz

agg ist unter der PostgreSQL Lizenz verfügbar.