Flame Graphs zur Analyse der Entwicklung des Oracle Optimizer

Luca Canali kombiniert in seinem Artikel Oracle Optimizer Investigated with Flame Graphs die von Brendan Gregg entwickelte Visualisierungstechnik der Flame Graphs mit den von Tanel Poder zusammengetragenen Informationen zur stack trace Analyse im Rahmen des Troubleshootings in Oracle Datenbanken. Dabei zeigt er anhand eines überschaubaren Beispiels die unterschiedlichen Graphen, die sich für eine Query ergeben, die zunächst mit dem rule based optimizer (RBO), dann mit dem cost based optimizer (CBO) der Version 11 und schließlich (more...)

Details zu dbms_space.space_usage

Man lernt eine Menge, wenn man versucht, anderen Anwendern die Arbeitsweise interner Oracle-Mechanismen zu erklären. Noch mehr lernt man, wenn Jonathan Lewis die Erläuterungen redigiert, die man beigesteuert hat.

Im OTN-Forum wurde dieser Tage die Frage gestellt, auf welcher Datengrundlage die Prozedur dbms_space.space_usage ihre Aussagen zum Füllgrad von Tabellen-Blocks generiert. Da ich darauf nicht unmittelbar eine Antwort wusste und eine halbherzige Google-Suche keine Ergebnisse brachte, habe ich ein SQL Trace (Event 10046) erstellt und (more...)

Join Tree Typen in Ausführungsplänen

Kyle Hailey liefert in seinem Blog eine kompakte Erläuterung zu den drei Join Tree Typen:
  • Left Deep
  • Right Deep
  • Bushy
Dabei beschreiben die Bezeichner die Anordnung der Elemente in einem klassisch arrangierten Ausführungsplan: beim right deep Plan stehen die am weitesten unten im Plan erscheinenden Operationen auch am weitesten rechts. Beim left deep plan hingegen steht das unterste Element relativ weit links - eine Postion versetzt zum aufrufenden (Join-)Element. Verständlicher wird der Zusammenhang mit den (more...)

Lateral und Cross Apply in 12c

In 12c hat Oracle weitere Anstrengungen unternommen, den Anforderungen des ANSI SQL-Standards bzw. den Herausforderungen der Konkurrenz zu entsprechen und neue Klauseln für die Spezifizierung von Join-Operationen eingeführt:

  • cross apply: erlaubt einen korrelierten cross join - nur die Sätze der linken Tabelle werden berücksichtigt, zu denen die korrelierende Bedingung in der Operation auf der rechten Seite ein Ergebnis liefert (an dieser Stelle verweise ich (more...)

Data Masking mit 12c

Sieht auf den ersten Blick eher bizarr aus, hat aber seine Anwendungsfälle... Gavin Sooma schreibt über das Cloud Control Data Masking Pack, mit dessen Hilfe  in 12c vertrauliche oder in anderer Weise sensitive Daten durch mehr oder minder zufällig generierte Daten ersetzt werden können. "Ersetzt" bedeutet in diesem Fall: physikalisch ersetzt - es geht also um eine semantische Änderung von Daten: und das ist natürlich nicht unbedingt etwas, das man in einer Produktivdatenbank durchführen (more...)

Unusable Indexes und Hints

Bei Jonathan Lewis findet sich ein Artikel, in dem gezeigt wird, dass Index-Hints den Optimizer zur Index-Verwendung zwingen, auch wenn der Index sich im Zustand UNUSABLE befindet, so dass der Zugriff in einem Fehler endet:
ORA-01502: index 'XXX' or partition of such index is in unusable state
Anschließend an den Artikel haben Matthias Rogel, Dom Brooks und Mohamed Houri einige Kommentare mit Links auf eigene Artikel ergänzt, die unter anderem zeigen, dass das Verhalten zwar (more...)

Darstellung des Execution Plans

Gestern hatte ich einen größtenteils harmlosen Kommentar zum Artikel Best practice for the sending of an Oracle execution plan von Franck Pachot abgegeben. Der Artikel beschäftigt sich mit den unterschiedlichen Möglichkeiten der Erzeugung von Ausführungsplänen mit rowsource Informationen für Anwender mit und ohne Tuning-Pack-Lizenz und liefert genau die Informationen von denen man als regelmäßiger Besucher von Oracle-Foren - also etwa der OTN-Foren, wo man den Herrn Pachot in letzter Zeit häufiger sieht -, hoffen (more...)

On Update Cascade Foreign Keys in postgres

Oracle unterstützt diese Option nicht, aber der SQL Server kennt sie und postgres auch: die Möglichkeit, einen Foreign Key als ON UPDATE CASCADE zu definieren und dadurch die Änderung eines Primary Keys der Parent Tabelle an die Child Tabelle zu propagieren und die Fremdschlüsselwerte dort entsprechend zu korrigieren:

dbadmin=# create table t_parent (pid int primary key);
CREATE TABLE
dbadmin=# create table t_child (id int primary key, pid int references t_parent on update cascade);
CREATE TABLE
(more...)

Wörter zählen mit regexp_count

Zu den Dingen, die ich seit Jahren auf meiner Erledigungsliste habe, gehört eine intensivere Beschäftigung mit regulären Ausdrücken. In der Zwischenzeit verlinke ich hier ein weiteres Mal Adrian Billington, der unter anderem eine umfassende Erläuterung zur regexp_count-Funktion liefert, die den Bestand der regexp-Funktionen in 11g ergänzte, und mit der sich die Anzahl des Auftretens eines Pattern in einem String ermitteln lässt. Und um es nicht beim Link zu belassen, hier noch ein Minimalbeispiel (more...)

Descending Index Quiz

Jonathan Lewis hat heute mal wieder eine Quizfrage gestellt und ausnahmsweise bin ich ziemlich schnell auf die Lösung gekommen. Die Frage lautet: wieso liefert ein descending Index einen duplicate Key Fehler, während ein entsprechender aufsteigender Index fehlerlos angelegt werden kann:

SQL> create unique index t1_i1 on t1(v1 desc);
create unique index t1_i1 on t1(v1 desc)
*
ERROR at line 1:
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found


SQL> create unique index t1_i1 on t1(v1);

(more...)

Komprimierungseffekte bestimmen mit dbms_compression.get_compression_ratio

Heute wurde im OTN Forum die Frage diskutiert, ob dbms_compression.get_compression_ratio für bereits komprimierte Tabellen eine Aussage zur Effektivität der Komprimierung liefert: also ob sich durch Updates so viele Entpackungen von Datensätzen ergeben haben, dass eine erneute Komprimierung sinnvoll wäre. Ich habe zur Beantwortung mein Standardverfahren eingesetzt:
  1. Nachdenken
  2. Zu keinem eindeutigen Ergebnis kommen
  3. Test erstellen und ausprobieren
Der Test in 11.2.0.1 dazu sah etwa folgendermaßen aus - und bediente sich aus ähnlichen Beispielen (more...)