Dr. Gerdewal ConsultingDr. Gerdewal Consulting
Insight 02.1

Oracle Sequences

Oracle Sequences: Performance-Boost durch Caching und die Falle bei der Sortierung.


Oracle Sequences nutzen einen Cache im Memory (SGA), um die Next-Values nicht bei jedem Abruf von der Disk lesen zu müssen. Ein zu niedriger Cache-Wert (Standard ist oft nur 20) führt bei hohen Lasten zu massiven 'Row Cache Objects' Enqueues. In Hochlastumgebungen oder bei der Nutzung von RAC wird ein Cache-Wert von 1000 oder höher empfohlen.

Das Problem: Bei einem Instanz-Crash oder einem Shared-Pool-Flush gehen die im Cache befindlichen Werte verloren.
Dadurch entstehen Lücken in der Nummernfolge, was für technische IDs unkritisch, für buchhalterische Zwecke aber relevant ist. Wichtig: Eine Sequence garantiert die Einzigartigkeit, aber niemals eine lückenlose oder streng chronologische Abfolge. Ein großer Fehler ist es, sich für die zeitliche Sortierung auf die Sequence-Nummer zu verlassen (ORDER BY sequence_id). Da verschiedene Sessions unterschiedliche Cache-Blöcke erhalten, kann eine später gestartete Session eine kleinere ID erhalten. Für chronologische Abfragen sollte daher immer ein Zeitstempel (TIMESTAMP) statt der Sequence genutzt werden. Zusätzlich kann das 'ORDER' Flag bei Sequences die Performance im RAC-Umfeld drastisch verschlechtern.

Zusammenfassend: Cache hoch für Performance, aber für die zeitliche Logik immer auf Timestamps setzen.