Um die Query Performance von (verteilten) Datenbanken zu verbessern, gibt es einen Mechanismus namens "Predicate Pushdown", auch "Filter Pushdown" genannt. Der Predicate Pushdown Mechanismus wird von PostgreSQL und Oracle unterstützt und auch von DuckDB, aber auch von DuckDB und Arrow, Parquet, Spark (alle von Apache). Zur Erinnerung: Ein "Prädikat" - ein Begriff aus der Mathematik und der funktionalen Programmierung - ist eine Funktion, die einen booleschen Wert, wahr oder falsch, zurückgibt. In SQL-Abfragen werden Prädikate typischerweise in der WHERE-Klausel verwendet, um Daten zu filtern.
Die Ausgangslage ist minimal ein DB-Server und ein Remote-Store. Dies können auch zwei PostgreSQL Server sein, die über den Foreign Data Wrapper postgres_fdw verbunden sind. Beim Predicate Pushdown übergibt ("pusht") der DB-Server das Prädikat einer Query an den Remote-Store, wo die Suchverarbeitung (Filterung) durchgeführt wird. Dies verlagert die Datenverarbeitung näher an die Datenquelle und reduziert den I/O, da der Remote-Store weniger Daten zurückliefern muss. Diese Verlagerung in eine frühere Phase der Abfrageausführung bietet Leistungsvorteile, da Nichtübereinstimmungen früher eliminiert werden und somit die Kosten für deren spätere Verarbeitung eingespart werden.
Hinweis: Lesen Sie diesen Text in Ruhe durch. Dies ist ein optionale Übung, wobei das Konzept "Predicate Pushdown" zum Prüfungsstoff gehört. Es wurde ja bereits bei "Optimierung und Indexe" in der Vorlesung erwähnt.
Wir wollen nun Predicate bzw. Filter Pushdown wie folgt ausprobieren:
Um die Query Performance von verteilten Datenbanken zu verbessern, gibt es einen Mechanismus namens "Predicate Pushdown", auch "Filter Pushdown" genannt. Der Mechanismus wird von PostgreSQL, Oracle und von DuckDB unterstützt, aber auch u.a. von DuckDB und Arrow, Parquet, Spark (alle von Apache). Zur Erinnerung: Ein "Prädikat" - ein Begriff aus der Mathematik und der funktionalen Programmierung - ist eine Funktion, die einen booleschen Wert zurückgibt. In SQL-Abfragen werden Prädikate typischerweise in der WHERE-Klausel verwendet, um Daten zu filtern.
a. Wiederholen Sie Queries Q2 und Q3 aus Aufgabe 1, diesmal jedoch in dem Sie bei der DuckDB-PostgreSQL-Verbindung Filter Pushdown einschalten. Das geschieht beim "CALL postgres_attach..." mit dem Named Parameter filter_pushdown=true (vgl. https://duckdb.org/docs/extensions/postgres_scanner.html DuckDB Postgres Scanner.
Die Ausgangslage des Deployments ist minimal ein DB-Server und ein Remote-Store-Server. Diese zwei können auch zwei PostgreSQL-Server sein, die über "Foreign Data Wrapper" (postgres_fdw) verbunden sind. Beim Predicate Pushdown übergibt ("pusht") der DB-Server das Prädikat einer Query an den Remote-Store-Server, wo die Suchverarbeitung (Filterung) durchgeführt wird. Dies verlagert die Datenverarbeitung näher an die Datenquelle und reduziert den I/O, da der Remote-Store weniger Daten zurückliefern muss. Diese Verlagerung in eine frühere Phase der Abfrageausführung bietet Leistungsvorteile, da Nichtübereinstimmungen früher eliminiert werden und somit die Kosten für deren spätere Verarbeitung eingespart werden.
Wir wollen nun das Predicate bzw. Filter Pushdown wie folgt ausprobieren:
a. Wiederholen Sie Queries Q2 und Q3 aus Aufgabe 1, diesmal jedoch in dem Sie bei der DuckDB-PostgreSQL-Verbindung Filter Pushdown einschalten. Das geschieht beim "CALL postgres_attach..." mit dem Named Parameter filter_pushdown=true (vgl. https://duckdb.org/docs/extensions/postgres_scanner.html[DuckDB Postgres Scanner].
b. Notieren Sie sich die Ausführungszeit (... clk:35.817 ms).
...
...
@@ -4733,7 +4735,7 @@ ifdef::exercise_solution[]
----
endif::exercise_solution[]
d. DuckDB kann Datensätze von den oben erwähnten Quellen (PostgreSQL, Arrow und Parquet) direkt streamen. Nebst dem Optimierung durch Predicate Pushdown ermöglicht es diese Integration, Daten von diesen Quellen mit SQL und über das API von DuckDB abzufragen und dabei die parallele, vektorisierte Ausführungsengine von DuckDB zu nutzen, ohne dass zusätzliche Daten kopiert werden müssen (sog. zero-copy). Lesen Sie dazu diesen Blogpost https://duckdb.org/2021/12/03/duck-arrow.html und nennen Sie die zwei weiteren Vorteile von zero-copy-Streaming.
d. DuckDB kann Datensätze von den oben erwähnten Quellen (PostgreSQL, Arrow und Parquet) direkt streamen. Nebst der Optimierung durch Predicate Pushdown ermöglicht es diese Integration, Daten von diesen Quellen über das API von DuckDB zu streamen und dabei die parallele, vektorisierte Ausführungs-Engine von DuckDB zu nutzen, ohne dass die Datensätze ins DuckDB-Memory kopiert werden müssen (sog. zero-copy). Lesen Sie dazu diesen https://duckdb.org/2021/12/03/duck-arrow.html[Blogpost zu "DuckDB quacks Arrow"] und nennen Sie die zwei weiteren Vorteile von zero-copy-Streaming.