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...)

Franck Pachot über SQL Plan Directives

In den letzten Wochen hat Franck Pachot eine Reihe interessanter Artikel zum Verhalten von SQL Plan Directives veröffentlicht, die ich an dieser Stelle grob vereinfachend zusammenfasse. Eine Einleitung zum Thema wollte ich mir eigentlich sparen, da ich etwas Derartiges hier bereits untergebracht hatte, aber der Herr Pachot hat es in Matching SQL Plan Directives and extended stats so schön zusammengefasst, dass ich mir seine Erklärung ausborge:
SQL Plan Directives in USABLE/MISSING_STATS state can create column (more...)

Dom Brooks über Plan-Stabilität

Dom Brooks zählt zu den Blog-Autoren, die sich am intensivsten mit Fragen der Stabilität von SQL-Ausführungsplänen beschäftigt haben. In Strategies for Minimising SQL Execution Plan Instability liefert er einen recht umfassenden historischen Überblick zur Entwicklung des Optimizers und jener Ergänzungen, die eingeführt wurden, um seine Informationsgrundlagen und Entscheidungsmöglichkeiten zu erweitern. Dabei gilt natürlich, dass die größere Flexibilität und die Einführung adaptiver Strategien dazu führen, dass die Stabilität der Optimizer-Entscheidungen geringer wird. Die grundlegende Frage dabei (more...)

postgres Ressourcen

Mit den Links zu den - in der Regel sehr lesenswerten - Artikeln des dbi-services Blog habe ich manchmal nicht allzu viel Glück, weil sie bisweilen statt beim gewünschten Artikel auf der Latest Entry Seite ankommen (was laut Franck Pachot ein Joomla-Problem sein könnte - und demnächst erledigt sein sollte, da ein Umzug nach wordpress geplant ist). Trotzdem versuche ich es ein weiteres Mal mit einer Verlinkung: diesmal auf den Artikel "What will be coming (more...)

Upsert in postgres

In meiner universitären Vergangenheit hätte ich es vielleicht "ein Desiderat der Forschung" genannt: ein Kommando, mit dessen Hilfe sich in postgres ein INSERT oder UPDATE in Abhängigkeit davon durchführen lässt, ob ein gegebener Schlüssel bereits in der Zieltabelle vorliegt. Diese in anderen Datenbanken als MERGE oder UPSERT bezeichnete Funktionalität ist seit vielen Jahren die wahrscheinlich größte Lücke im ansonsten sehr mächtigen SQL-Dialekt von postgres. Mit Release 9.5 wird diese Lücke nun offenbar endlich geschlossen (more...)

Degenerierte Indizes

Seit ich begonnen habe, mich mit Datenbanken zu beschäftigen, lautet eine der populärsten Fragen in Oracle-Foren: mit welcher Häufigkeit soll ich meine B*Tree-Indizes neu aufbauen lassen? Zu behaupten darüber hätten Kriege stattgefunden, wäre vielleicht ein wenig übertrieben - aber heftige Auseinandersetzungen waren es allemal. Inzwischen ist dieser Konflikt weitgehend zur Ruhe gekommen, was vermutlich damit zusammen hängt, dass die Antwort eigentlich unstrittig ist: Oracles Implementierung von Indizes macht Rebuilds weitgehend unnötig - sie sind nur (more...)

Optimizer-Transformationen: Predicate Pushing in Oracle und Postgres

Das in der Praxis am häufigsten verwendete Verfahren der Query-Performance-Optimierung ist vermutlich in allen RDBMS immer noch das der Umformulierung: da es in SQL für so ziemlich jede Fragestellung mehrere Lösungsmöglichkeiten gibt, kann man in aller Regel versuchen, eine andere syntaktische Variante zu wählen - und hoffen, dass der Optimizer dafür einen effektiveren Plan findet. Ich will dieses Verfahren nicht grundsätzlich negativ bewerten: es kann ohne Zweifel seine Erfolge vorweisen und es gibt RDBMS, bei (more...)

Ein Feature-Request: Actually Evaluated Rows

Vor ein paar Wochen habe ich im OTN-Forum an einer Diskussion teilgenommen, bei der sich einmal mehr gezeigt hat, dass die rowsource statistics in Oracles Trace-Instrumentierung zwar sehr viele wichtige Informationen liefern, aber doch ein paar interessante Angaben aussparen: die darin enthaltene A-Rows-Spalte (= actual rows) liefert die Anzahl der Datensätze, die als Ergebnis eines Schrittes an den folgenden Schritt im Ausführungsplan weitergegeben werden. Das ist natürlich sehr nützlich und gestattet durch den Vergleich von (more...)

HASH JOIN und NOT EXISTS

Zwei entsprechende Threads im OTN-Forum haben Jonathan Lewis dazu veranlasst innerhalb von zwei Wochen zwei Artikel mit dem identischen Titel Not Exists zu veröffentlichen. Da der Herr Lewis in der Regel über ein sehr zuverlässiges Gedächtnis verfügt, nehme ich an, dass er das mit Absicht so gemacht hat - und dass es keinen unique constraint auf seinen Artikelüberschriften gibt... Hier ein paar Notizen zu den Artikeln:

Function Based Indexes und CURSOR_SHARING

Randolf Geist erläutert in seinem Blog einige interessante Details zum Zusammenspiel der Cursor-Sharing-Optionen Force und Similar (deprecated) - bei denen die verwendeten Literale durch Bindewerte ersetzt werden - mit funktionsbasierten Indizes (= Function Based Indexes; aka FBI). Grundsätzlich gilt dabei, dass FBIs durch die genannten Cursor-Sharing-Varianten unwirksam werden. Aber zumindest für den Bereich der Releases 10.2.0.4 bis 11.2.0.3 gibt es bestimmte Sonderfälle mit ergänzender Built-in-Logik, die die FBI-Verwendung der (more...)