Bizarre Plandarstellung mit dbms_xplan.display_cursor

Vor einigen Tagen ist mir aufgefallen, dass in einer Datenbank (11.2.0.3), an deren Wartung ich seit kurzem beteiligt bin, für eine harmlose Nagios-Check-Query mit dbms_xplan.display_cursor höchst merkwürdige Pläne generiert wurden, die die einzelnen Schritte des Ausführungsplans in schier endloser Folge wiederholten. Ein Blick in v$sql_plan zeigte, dass hier tatsächlich extrem viele Plan-Duplikate vorlagen, aus v$sql_shared_cursor war zu ersehen, dass die Begründung der neuen Cursor in der Regel mit OPTIMIZER_MISMATCH oder PX_MISMATCH angegeben (more...)

Indizierung für LIKE-Operationen in postgres

Ein interessanter Hinweis von Daniel Westermann im DBI Services Blog: durch die Verwendung der pg_trim extension ist es in postgres möglich, (GIN oder GiST) Indizes zur Unterstüzung von Like-Einschränkungen mit führendem (oder auch im Vergleichsstring enthaltenen) Platzhalter(n) zu erstellen. Laut Dokumentation gilt:
The pg_trgm module provides GiST and GIN index operator classes that allow you to create an index over a text column for the purpose of very fast similarity searches. These index types support (more...)

Schlechtere Performance durch semi_to_inner-Transformation in 12c

Jonathan Lewis zeigt in seinem aktuellen Artikel 12c Downgrade einen Fall, in dem der Optimizer in 12c einen deutlich weniger effizienten Plan auswählt als in 11.2.0.4, weil er die Query besser versteht und erkennt, dass darin eine Transformation eines Semi-Joins zu einem Inner-Join möglich ist, was grundsätzlich eine sinnvolle Strategie sein sollte. Allerdings profitiert der semi-join nested loop von der gleichen Optimierung, die auch für das Caching der Ergebnisse skalarer Subqueries verwendet (more...)

Performance-Probleme beim Zugriff auf DBA_FREE_SPACE

Das Phänomen ist offenbar relativ bekannt, war mir aber bisher nicht begegnet (oder in Erinnerung geblieben): ein Icinga-Test zur Bestimmung des Füllgrads eines Tablespaces erreichte zuletzt Laufzeiten von über einer Minute, was zu Timeouts und Icinga-Fehlern führte. Schnell zu bestimmen war, dass das eigentliche Problem im Zugriff auf DBA_FREE_SPACE lag. Aber warum reagierte diese Dictionary-View so träge? Zur Prüfung habe ich zunächst einen Blick in die Definition in DBA_VIEWS geworfen, aber den hätte ich mir (more...)

OS-Analyse für Logical I/O-Operationen

Fritz Hoogland, dessen Blog eine der besten Quellen zu I/O-Fragen in Oracle ist, beschäftigt sich in seinem aktuellen Artikel mit der Performance von Logical-I/O-Zugriffen. Ausgangspunkt ist dabei, dass der Kernel aktueller Redhat-Versionen die Möglichkeit bietet, via systemtap die Performance einzelner OS-Routinen zu überprüfen. Aufgrund entsprechender Aussagen des Oracle Supports und eigenen Beobachtungen kann der Autor Consistent Reads der C-Funktion kcbgtcr() zuordnen, während Current reads wohl durch kcbgcur() abgebildet sind. Aufbauend auf diesen Voraussetzungen werden (more...)

Neue SQL Plan Operationen und Hints in 12c

Sayan Malakshinov hat sich die Mühe gemacht, eine kommentierte Link-Liste zu den in 12c eingeführten SQL PLAN OPERATIONS und Hints zusammenzustellen. Das Ergebnis sieht ausgesprochen vielversprechend aus.

Insert-Sortierung und Index-Größe

Mal wieder ein Titel, der den Eindruck erweckt, dass vielleicht eine größere Präzisierung möglich gewesen wäre - aber da Richard Foote dem Artikel, den ich hier wiedergebe, den Titel Why A Brand New Index Might Benefit From An Immediate Coalesce (One Slip) gegeben hat, fühle ich mich nicht dazu verpflichtet, länger darüber nachzudenken. Worum es geht, ist Folgendes: der Herr Foote zeigt in seinem Blog, dass ein Index auf einer via Insert as Select befüllten (more...)

I/O-Performance in Datenbanken und auf OS-Seite

Auf Oracle-L hat Stefan Koehler heute einen interessanten Link zum Thema "Kommunikation zwischen DBAs und Storage-Administratoren" untergebracht: im referenzierten Artikel erläutert Bart Sjerps, dass beide Gruppen oft von unterschiedlichen Dingen sprechen, wenn sie über I/O-Performance diskutieren: während die Storage-Admins die reine Service time vor Augen haben - also die Zeit, die die Storage selbst benötigt, um einen einzelnen I/O request zu beantworten (= die von iostat ausgegebene Spalte svctm) -, interessieren sich die DBAs (more...)

Permanente Deaktivierung einer SQL Plan Directive

Franck Pachot erklärt, wie man dafür sorgt, dass eine SQL Plan Directive dauerhaft deaktiviert bleibt, um den Overhead des Samplings zu vermeiden. Das Problem dabei ist, dass die Direktive nach einer vollständigen Löschung erneut erzeugt werden kann. Um das zu verhindern, muss die Direktive deaktiviert, aber ihre Löschung verhindert werden - die Befehlsfolge dazu lautet:

exec dbms_spd.alter_sql_plan_directive(14130932452940503769,'ENABLED','NO');
exec dbms_spd.alter_sql_plan_directive(14130932452940503769,'AUTO_DROP','NO');

Grundsätzlich sind die Direktiven jedenfalls ein Thema, das man für 12c klar im Blick behalten muss.

Cardinality Schätzungen für TEMP TABLE TRANSFORMATION

Randolf Geist hat vor einigen Wochen in zwei Artikeln weitere Details zum Verhalten der Cardinality-Schätzungen im Rahmen der TEMP TABLE TRANSFORMATION geliefert - in Ergänzung zu zwei (geringfügig) älteren Artikeln, die ich hier gelegentlich verlinkt habe und in denen vor allem darauf hingewiesen wurde, dass die Transformation nicht kostenbasiert ist, sondern automatisch angewendet wird (sofern die erforderlichen Voraussetzungen erfüllt sind), dass sie zu einer Materialisierung aller Spalten der CTE führt - und nicht nur der tatsächlich (more...)

Leere Index-Blocks nach einem Rollback

Im OTN-Forum wurde vor einigen Tagen die Frage gestellt, wie es dazu kommen kann, dass ein Index nach einer abgebrochenen großen Update-Operation zahlreiche vollständig leere Blocks enthält. Dazu gab es im Forum ein paar kluge Antworten - und eine weniger kluge von mir, die zwar das gundsätzliche Problem benannte (nämlich die Tatsache, dass Index-Einträge nicht direkt gelöscht werden, sondern als gelöscht markiert), aber in der Erläuterung so unvollständig blieb, dass ich selbst nicht mehr sagen (more...)

Grundlagen des kostenbasierten Optimizers

Jonathan Lewis hat für AllThingsOracle eine neue Serie Basics of the Cost Based Optimizer gestartet und liefert damit vermutlich eine neue Standardreferenz zum Thema. Allerdings weist der Autor darauf hin, dass die Serie eher einführenden Charakter besitzt und nicht allzu sehr auf die technischen Details eingeht, weshalb ich meine Zusammenfassungen eher knapp zu halten gedenke:

Typen des Dynamic Sampling Hint

Jonathan Lewis weist - erneut - darauf hin, dass der dynamic sampling Hint in zwei Versionen existiert: als cursor level Hint und als statement level Hint, und dass die Anzahl der gesampelten Blocks von der Version abhängt: Level 4 auf cursor level verwendet 64 Blocks als Sample - sofern bestimmte Voraussetzungen gegeben sind, während Level 4 auf table level 256 Blocks verwendet, und das unabhängig von weiteren Voraussetzungen. Deshalb plädiert der Autor dafür, den Typ (more...)

Hoher Parse-Overhead durch Dynamic Statistics in der Standard Edition 12c

Nicht mein bester Titel für einen Blog-Artikel; aber wahrscheinlich auch nicht der schlechteste... Worum es geht, ist Folgendes: Franck Pachot hat im DBI Blog vor kurzem ein recht unerfreuliches Problem angesprochen, das sich auswirkt, wenn man in 12c Dynamic Statistics (vormals: Dynamic Sampling) in einem Standard Edition System verwendet. Grundsätzlich reduziert Oracle in 12c den Overhead beim Parsing, der sich durch das Sampling ergibt, dadurch, dass die Queries, die für die Erzeugung der Dynamic Statistics (more...)

INDEX FULL SCAN (MIN/MAX) und partitionierte Tabellen

Eine Frage, die ich mir gelegentlich schon einmal gestellt hatte, und dachte, die Antwort hier im Blog bereits notiert zu haben, lautet: ist der INDEX FULL SCAN (MIN/MAX) als Zugriffsoption auch für partitionierte Tabellen möglich? Da diese Antwort aber auf Anhieb unauffindbar zu sein scheint und womöglich von mir nie protokolliert worden ist, schreibe ich sie (noch einmal?) auf:

drop table t;
create table t
( id number
, startdate date
)
partition by range (more...)

MP Oracle Blog 2015-06-10 23:34:00

Mauro Pagano zeigt in seinem jüngsten Artikel einen Fall, in dem ein Bloom-Filter in den Filter-Prädikaten eines Execution Plans erscheint, aber im Plan selbst nicht aufgeführt wird. Seine Analyse zeigt, dass es sich dabei um ein Problem der Darstellung in dbms_xplan handelt: in 11.2 fehlt der Filter, aber in 12.1 wird er korrekt angezeigt. Interessant ist dabei vor allem die Analysestrategie: zunächst bestimmt er mit Hilfe von Event 10128, dass ein weiterer im (more...)

Merge für überlappende Intervalle

Ein Thema, das in SQL regelmäßig viel Freude bereitet, ist die Logik der Verschmelzung von Intervallen. Da ist es sehr nützlich, wenn sich jemand wie Stew Ashton der Fragestellung annimmt, den Tom Kyte in seinen Oracle-Magazin-Artikeln schon wiederholt anerkennend erwähnt hat. In seinem aktuellen Artikel Merging Overlapping Date Ranges stellt der Autor zunächst die 13 möglichen Fälle der Intervall Agebra von James Allen vor und liefert dann eine überraschend kompakte SQL-Lösung dazu (die letztlich eine (more...)

Reihenfolge der Prädikatauswertung

In seinem aktuellen Artikel Predicate Order erläutert und modelliert Jonathan Lewis ein Problem, das vor kurzem in einem OTN Thread vorgestellt wurde: abhängig von der Verwendung von IN oder NOT IN läuft eine Query in einen Fehler "ORA-01722: invalid number" oder wird erfolgreich verarbeitet. Das grundsätzliche Problem ist dabei - und das ist zunächt einmal keine Überraschung - die Wahl ungeeigneter Datentypen: in dem per IN oder NOT IN eingeschränkten Attribut finden sich nicht-numerische Werte, (more...)

Space-Management und Direct Path Ladeoperationen

Im Blog der CBO-Entwicklung erklärt Nigel Bayliss detailliert, wie das Management des Speicherplatzes in den Datenblocks bei direct path load funktioniert. Tatsächlich gibt es in diesem Zusammenhang mehrere unterschiedliche Strategien und erst in 12.1.0.2 wurde die Information, welche Strategie tatsächlich verwendet wird, in den Ausführungsplänen ergänzt. Der Grund für die Verwendung mehrerer Strategien ist dabei, dass das Verfahren in sehr unterschiedlichen Kontexten einsetzbar sein muss: für partitionierte und nicht partitionierte Tabellen, für (more...)

Big Table Caching mit 12c

Eigentlich glaubte ich, mich erinnern zu können, hier schon mal einen Eintrag zum in 12c eingeführten Big Table Caching verlinkt zu haben - aber offenbar ist das nicht der Fall. Daher nun der Verweis auf die einleitende Untersuchung zum Thema von Martin Bach. Grundsätzlich dient das Feature dazu, einen Anteil des Buffer Caches für Full Scans zu reservieren. Dieser Anteil kann zwischen 0% (default) und 90% liegen, mindestens 10% müssen für sonstige Operationen verfügbar bleiben. (more...)