Im Artikel Waiting for PostgreSQL 19 – Display Memoize planner estimates erklärt Hubert Lubaczewski, was es mit dem Schlüsselwort Memoize in Postgres Ausführungsplänen auf sich hat: es handelt sich um einen seit Version 14 verfügbaren Caching-Mechanismus, der wiederholt benötigte Informationen in einem Cache-Bereich einer bestimmten Größe ablegt und im "actual plan" Informationen über die Trefferquote in diesem Cache gibt. Mit Version 19 wird diese Information dann bereits im simplen explain (ohne analyze) - also vor der Ausführung abgebildet.
Montag, August 04, 2025
Montag, Juli 21, 2025
Konzeptionelle Unterschiede zwischen Postgres und Oracle
Gerade stellte ich mir die Frage, wie ich diese Links später noch mal finden könnte, und dann fiel mir ein, dass ich dafür einst eine gute Lösung hatte: meinen Blog. Daher bringe ich den Verweis auf die folgende interessante Artikelserie von Kellyn Pot’Vin-Gorman, die Oracle und Postgres aus konzeptioneller Sicht gegenüberstellt:
- Oracle DBA to PostgreSQL, Part 1: Install and Architecture
- PostgreSQL for the Oracle DBA, Part 2: Physical Data Structures, Storage, and Processes
- PostgreSQL for the Oracle DBA, Part 3: Transaction Control, Locking, and Performance Insight
- PostgreSQL for the Oracle DBA, Part 4: Query Tuning and the PostgreSQL Planner
- PostgreSQL for the Oracle DBA, Part 5: Understanding Wait Analysis
- PostgreSQL for the Oracle DBA, Part 6: Tuples, MVCC, and Two Views
Sonntag, April 16, 2023
if (not) exists für DDL in Oracle 23c
Noch ein nützliches Detail, das es in Oracle 23c geschafft hat - und das bei anderen RDBMS schon länger im Spiel war: die Möglichkeit, Fehler in SQL Skripten zu vermeiden, die sich aus der Existenz oder Nicht-Existenz von Objekten ergeben:
- create ... if not exists
- drop ... if exists
Mittwoch, April 12, 2023
Group By Erweiterung in Oracle 23c
Nein, ich schreibe hier nichts mehr, aber eben habe ich eine interne SQL Schulung gehalten und darin behauptet, dass Oracle eine Positionsangabe im group by nicht unterstützt:
cdb$root@SYS:some-system > select username, count(*) from v$session group by 1;
select username, count(*) from v$session group by 1
*
FEHLER in Zeile 1:
ORA-00979: Kein GROUP BY-Ausdruck
Mit Oracle 23c ändert sich das offenbar, wie Dani Schnider in https://danischnider.wordpress.com/2023/04/07/group-by-extensions-in-oracle-23c/ erläutert. Natürlich spendiert Oracle dafür auch noch einen Parameter group_by_position_enabled, den man auf true setzen muss, wenn man das Feature auch noch nutzen möchte.
Freitag, Mai 27, 2022
Postgres Links: selten genutzte Features und Tipps zur Massendatenbehandlung
Nur, damit ich die Artikel - vielleicht - wieder finde:
Der Artikel "Lesser Known PostgreSQL Features" von Haki Benita stellt - nun ja: ein paar weniger bekannter Postgres Features vor... An mir vorbei gegangen war unter anderem gen_random_uuid, womit man seit Version 13 uuid-s erzeugen kann, ohne die uuid.ossp extension installieren zu müssen.
Auf interessant ist "Common DB schema change mistakes" von Nikolay Samokhvalov, der erläutert, was man bei Massendatenoperationen besser vermeiden sollte. Hier finde ich den Hinweis auf "drop index concurrently" interessant: das hatte ich nicht mehr in Erinnerung.
Freitag, Februar 25, 2022
Oracle Transformationen
Jonathan Lewis hat bei Redgate eine Serie zu Transformationen des Oracle Optimizers gestartet:
- Transformations by the Oracle Optimizer: erläutert das unnesting von IN-Listen, die zu inline Views umgewandelt werden, die dann in einen Join einbezogen werden können. Außerdem werden die query blocks angesprochen, die in den Ausführungsplänen erscheinen und zur Hint-Definition eingesetzt werden können.
- The effects of NULL with NOT IN on Oracle transformations: erklärt (noch mal), warum es nicht immer möglich ist, NOT IN zu NOT EXISTS umzuwandeln, und inwieweit NOT NULL Constraints das ändern können. Zur Analyse des Verhaltens können die Suffixe "NA" (null-aware/accepting) und "SNA" (single null-aware/accepting) bei den Joins im Ausführungsplan herangezogen werden.
Früher habe ich an dieser Stelle gerne behauptet, dass ich folgende Artikel später ergänzen würde - aber da das schon optimistisch war, als ich noch mehr Zeit hatte, spare ich mir diese Absichtserklärung jetzt.
Donnerstag, Dezember 30, 2021
Rekursive CTEs
Ja, mir ist schon klar, dass 2021 nicht das beste Jahr für diesen Blog war - wofür der Grund der übliche war: jede Menge Arbeit. Und, ich nehme es vorweg, 2022 wird nicht viel besser. Aber völlig einschlafen soll er auch nicht, so dass ich vor dem Jahresende schnell noch Franck Pachot mit seinem Artikel "Learn how to write SQL recursive CTE in 5 steps" erwähne, in dem er hübsch kompakt erklärt, wie man sich eine rekursive CTE aufbaut und wozu die Einzelteile gut sind. Auch als Apostel des yubabytedb Kults bleibt der Herr Pachot extrem lesenswert.
Donnerstag, November 26, 2020
Oracle Performance-Gründe gegen "select *"
Nichts Neues ist, dass der Zugriff auf Tabellen ohne eine explizite Angabe der relevanten Spalten - also mit: select * from table - aus sehr vielen Gründen in der Regel keine gute Idee ist. Tanel Poder hat jetzt eine schöne Liste mit Punkten erstellt, die im Oracle-Kontext die Performance-Aspekte des Themas betreffen. Einige dieser Punkte sind auch für andere RDBMS in gleicher oder ähnlicher Weise relevant.
Freitag, Oktober 23, 2020
Postgres Performance seit Version 8.3
Ja, es ist eine Weile her, seit ich hier zuletzt etwas geschrieben habe. Und so richtig viel Neues kommt auch jetzt nicht. Nur der Link auf eine interessante Untersuchung von Tomas Vondra von 2ndQuadrant, der die Performance von Postgres beim TPC-H Benchmark für die Versionen 8.3 bis 13 untersucht. Die Ergebnisse sind in vielen Details sehr interessant und zeigen unter anderem die Rolle, die die Parallelisierung bei den neueren Releases spielt. Aus den Graphen würde ich ableiten, dass die letzten Releases seit Version 10 keine extrem spektakulären Performance-Verbesserungen mehr gebracht haben, aber durchaus eine positive Entwicklung. Das mag aber auch an der Skalierung liegen, da die Verbesserungen davor sehr deutlich sichtbar waren.
Donnerstag, Juli 09, 2020
Join-Performance in relationalen Datenbanken
Freitag, Mai 15, 2020
Plan Prädikate in AWR mit Oracle 20
Montag, April 06, 2020
dense_rank zur Bestimmung von Maximalwerten pro Gruppe
Montag, Februar 10, 2020
MVCC Verhalten bei Oracle, Postgres und dem SQL Server
A DML statement has two phases: one to find the rows and the second one to modify them. A DELETE or UPDATE in Oracle and Postgres runs the first in snapshot mode: non-blocking MVCC. The second must, of course, modify the current version. This is a very complex mechanism because it may require a retry (restart) when the current version does not match the consistent snapshot that was used for filtering. Both PostgreSQL and Oracle can ensure this write consistency without the need to block the reads. SQL Server has implemented MVCC more recently and provides non-blocking reads only for the SELECT reads. But a read can still be in blocking situation for the query phase of an update statement.
Freitag, Januar 17, 2020
Falsche Ergebnisse bei Group By Elimination in Oracle 12.2
Freitag, Dezember 20, 2019
Caching von PL/SQL Funktionsaufrufen
a.xy_bat_id = f_get_id('BJOBD176')
a.xy_bat_id = (selectf_get_id('BJOBD176')fromdual)
Donnerstag, November 28, 2019
B*Tree Index Optimierungen in Postgres 12
- Reduzierung des locking overhead bei Inserts
- Einführung einer "redindex concurrently" Option (was aus meiner Sicht ein extrem nützliches Feature ist)
- Performance-Verbesserungen für index-only scans bei Indizes mit vielen Attributen
- Ergänzung einer dictionary view pg_stat_progress_create_index, mit der sich der Fortschritt beim Index-(Neu-)Aufbau überprüfen lässt
Montag, Oktober 28, 2019
Speicher-Fragmentierung für Linux-Server
- How to hang a server with a single ping, and other fun things we learned in a 18c upgrade: behandelt die Probleme eines Upgrades eines alten und komplexen Systems von Oracle 11 auf 18, die sich zunächst in einem hohen Load Average manifestierten und mit ps analysiert werden konnten, wobei vor allem der "wait channel" (wchan) ausgewertet wurde. Das Ergebnis deutete auf Memory Fragmentierung hin, da vor allem der Channel cma_acquie_dev sichtbar wurde, wobei CMA für "Contiguos Memory Allocator" steht. Zur Behebung der Symptome diente zunächst die Deaktivierung von NUMA, aber die eigentliche Ursache waren wohl rds-ping Operationen. Wer angesichts dieser Zusammenfassung etwas ratlos bleibt (zumindest im Bereich der Auflösung), darf das gerne auf meine mangelnde Sachkenntnis in diesen Bereichen zurückführen.
- Memory fragmentation: the silent performance killer: erklärt Memory Fragementation und zeigt, mit welchen Mitteln man die zugehörigen Effekte in Linux-Systemen analysieren kann. Hier versuche ich mich erst gar nicht an der Zusammenfassung, sondern zitiere "As usual, exact solution will depend on the specific scenario of the problem, but it would typically involve changing VM settings (such as vm.min_kbytes_free) or adjusting memory cgroup configuration."
- Where did my RAM go?: liefert ein wenig R code zur Visualisierung der Performance-Informationen.