Korrigierte CBO-Cardinality-Schätzungen für OR-Prädikate

Stefan Koehler weist in seinem Blog darauf hin, dass ein von Jonathan Lewis in Cost Based Oracle beschriebenes Problem in aktuelleren Releases behoben ist: OR-verknüpfte Range-Prädikate, die den kompletten Wertebereich einer Tabelle umfassen, werden nun in ein einfaches IS NOT NULL Prädikat umgewandelt. Das handliche Beispiel dafür ist in Blog und Buch eine Monatsliste mit der dafür definierten Einschränkung:
where MONTH_NO > 8 OR MONTH_NO <= 8
In 10.2.0.5 führte diese Ausgangslage (more...)

Zur Semantik der ON clause im ANSI Left Outer Join

Vielleicht wäre es sinnvoller, auf diesen Eintrag zu verzichten, weil er ein wenig peinlich ist - aber was soll's: gestern ist mir im Rahmen eines OTN Threads aufgefallen, dass meine Interpretation der ANSI OUTER JOIN Syntax bislang unzutreffend war. Ich verzichte auf nähere Erläuterungen zu meiner Fehleinschätzung (die für meine übliche Formulierung von ANSI OUTER JOINs ganz plausibel war), und erkläre lieber gleich, was das ON tatsächlich bedeutet:

drop table t1;
drop table t2;

create (more...)

Read Committed Isolation Level im SQL Server

Im SQLPerformance.com Blog hat Paul White einige interessante Punkte zur Implementierung des Isolation Levels Read Committed im SQL Server aufgeschrieben. Grundsätzlich gibt es im SQL Server dieser Tage zwei Implementierungen für Read Committed, von denen die ältere (zumindest vom Herrn White) als Locking Read Committed bezeichnet wird. Da der Autor einen weiteren Artikel zum Thema ankündigt, starte ich an dieser Stelle eine Aufzählung:

Ausführungspläne erzeugen und interpretieren

Bisher habe ich auf die Frage nach einer guten Erklärung für Ausführungspläne in der Regel auf Troubleshooting Oracle Performance von Christian Antognini verwiesen - oder auch auf die im Netz verfügbare (und hier verlinkte) gekürzte Version des sechsten Kapitels. Als Alternative oder Ergänzung dazu kommt inzwischen eine gerade von Jonathan Lewis für AllThingsOracle begonnene einführende Serie in Betracht:

Datenbank-Videos von Jens Dittrich

An der Universität des Saarlandes habe ich allerlei studiert, aber keine Informatik - trotzdem hätte ich auf die ebenso umfangreiche wie interessante Sammlung der Youtube-Videos von Jens Dittrich vielleicht schon früher mal hinweisen können. Hier findet man Einführendes aber auch komplexe Detailanalysen - und dabei zeichnen sich die Beiträge insbesondere auch durch die unterhaltsame Präsentation aus, für die der Herr Professor Dittrich schon allerlei Preise gewonnen hat. Einmal mehr muss ich bei Carl Einstein borgen: (more...)

Änderung für NVL costing

Jonathan Lewis weist in seinem Blog darauf hin, dass die cardinality für Prädikate der Form: NVL(spalte, konstanter_datumswert) bis Version 11.1.0.7 mit dem Standardwert "5% for range-based predicate on function(col)" berechnet wurde, aber in 11.2.0.4 eine plausiblere Behandlung erfährt, die das Prädikat in den NULL-Fall und den Fall des Vergleichs der vorhandenen Werte aufspaltet, und dadurch deutlich zutreffendere Schätzungen liefert (was für ähnlich gelagerte Fälle auch schon in früheren Releases (more...)

Add Column DDL-Optimierung in 11g

Im OTN-Forum wurde heute ein Feature erwähnt, das mir bisher entgangen war (oder das ich schon wieder vergessen hatte): das Hinzufügen einer Spalte mit Default-Wert und NOT NULL Constraint kann ohne Update der betroffenen Datensätze durchgeführt werden und erfordert als reine Metadaten-Anpassung nur sehr wenig Zeit. Ohne den NOT NULL Constraint muss hingegen jeder einzelne Datensatz aktualisiert werden, was sehr lange Laufzeiten hervorruft. In 12c ist inzwischen auch die Variante ohne den NOT NULL Constraint (more...)

Log-Dateien parsen mit Postgres

Gerade ist mir klar geworden, wie handlich das Parsen von Log-Dateien in der postgres-Datenbank ist. Der gesamte Vorgang beschränkt sich auf folgende Schritte:

-- Anlage einer Tabelle mit einer einzigen Spalte (vom Typ TEXT)
create table my_log(log_line text);

-- Einlesen via copy-Kommando
copy my_log(log_line)
from 'pfad_der_log_dateien/log_datei.txt';

-- Parsen der Eingabe-Strings mit Hilfe der Funktion split_part in beliebig viele Abschnitte
-- „Split string on delimiter and return the given field (counting from one)“
select split_part(log_line, (more...)

Langwierige Statistikerstellung mit auto_sample_size

Nur ein knapper Hinweis: Jonathan Lewis zeigt, dass die Verwendung der auto_sample_size seit 11g in Kombination mit der Ermittlung des approximate NDV Mechanismus zu unerwartet langen Ausführungszeiten bei der Statistikerfassung führen kann. Betroffen sind:
  • Auf LOBs basierende virtual columns mit zugehörigen Indizes. Dabei wird das Ergebnis des Funktionsaufrufs im Index gehalten, aber in der Tabelle erscheint nur die Funktionsdefinition, so dass Oracle bei der Statistikerstellung den Funktionsaufruf für jede Zeile ausführen muss - und wenn (more...)

SQL Server 2014

Wie man im Official Microsoft Blog erfährt, läuft der SQL Server 2014 zum 01.April 2014 feierlich vom Stapel, was immerhin früh genug ist, um den Namen nicht zur Farce werden zu lassen.

Optimizing Oracle Performance von Cary Millsap

Amazon hat mich gebeten, mein kürzlich erworbenes Exemplar des Buches zu rezensieren, und bei solchen Anfragen neige ich zu Brechts: "Die etwas fragen/ Die verdienen Antwort". Und wenn ich es dort veröffentliche, dann kann ich es auch hier unterbringen:

Nachdem mir vor kurzem aufgefallen war, dass ich kein Exemplar von Cary Millsaps Standardwerk mehr besaß, habe ich mir noch mal eines gekauft und es auch noch einmal gelesen - und es gibt nicht viele Oracle-Bücher, (more...)

Randolf Geist über Parallel Execution Skew

Für AllThingsOracle hat Randolf Geist eine kleine Serie zum Thema Parallel Execution Skew gestartet - wobei der Begriff Skew in diesem Kontext die ungleiche Verteilung der zu leistenden Arbeit auf die in der parallelen Verarbeitung verfügbaren Ressourcen bezeichnet.
  • Parallel Execution Skew – Introduction: nach der einleitenden Definition folgt der Hinweis, das eine ungleiche Arbeitsverteilung zwischen den parallelen Ressourcen im ungünstigsten Fall zu einer Verlängerung der Laufzeit gegenüber der seriellen Verarbeitung führen kann, da die (more...)

Temporäre Tablespaces und Sortierungen

Jonathan Lewis hat sich zuletzt in mehreren Artikeln mit der Verwendung temporärer Tablespaces, insbesondere im Zusammenhang mit Global Temporary Tables (GTT) auseinandergesetzt:
  • 12c Temporary: zeigt, dass in 12c eine Session potentiell drei verschiedene temporäre Tablespaces verwenden kann. Über den Parameter temp_undo_enabled wird gesteuert, dass die Undo-Informationen einer GTT in den default temporary tablespace der Datenbank geschrieben werden sollen. Seit 11g kann man im Create für eine GTT den temporary tablespace explizit angeben, was zur feingranularen (more...)

Deadlock bei Shrink Space

Jonathan Lewis beschreibt in seinem Blog ein ziemlich erstaunliches Phänomen: wenn man zwei Indizes der gleichen Tabelle in unterschiedlichen Sessions über ALTER INDEX ... SHRINK SPACE verkleinern möchte, dann versuchen beide Sessions ein exklusives (TM-) Lock auf die Tabelle zu bekommen - und blockieren sich dadurch gegenseitig. In der Alert.log finden sich auch Hinweise auf das deadlock, aber es erfolgt keine automatische Auflösung - beide Sessions warten und warten und warten...

Direct Path Inserts und unusable indexes

Erst mal meine Entschuldigung für den Titel - eine brauchbare Übersetzung für "unusable indexes" ist mir nicht eingefallen (und über "direct path inserts" mache ich mir nicht einmal mehr Gedanken). Dann zum Thema: im OTN Forum wurde heute die Frage diskutiert, in welchen Fällen man Indizes vor einem Massenladevorgang UNUSABLE setzen und nach der Ladeoperation wieder neu aufbauen lassen kann, worauf die Antwort lautet, dass das Verfahren mit bitmap und non-unique B*Tree-Indizes problemlos funktioniert, mit (more...)

Analyse für Index Rebuild

Die Zeiten, in denen das Thema automatisierter und regelmäßiger Index Rebuilds intensiv diskutiert wurde, sind wahrscheinlich vorbei, obwohl in den einschlägigen Oracle-Foren noch immer zugehörige Fragen auftauchen. Ein Grund dafür, dass das Thema nicht deutlich früher ad acta gelegt wurde, war möglicherweise die Tatsache, dass der Oracle Support selbst ein paar Skripte zur Bestimmung von Rebuild-Kandidaten bereitstellte. Richard Foote weist nun in seinem Blog darauf hin, dass eines der abwegigeren Exemplare dieser Gattung inzwischen von (more...)

Kostenbasierte Optimierung mit Postgres

Mit den Details der kostenbasierten Optimierung von SQL-Queries in Oracle beschäftige ich mich, seit ich Jonathan Lewis' Standardwerk Cost Based Oracle zum ersten Mal gelesen habe - was ziemlich bald nach seiner Veröffentlichung im Jahr 2005 geschehen sein dürfte. Nachdem ich inzwischen etwa ein halbes Jahr lang mehr oder minder intensiv mit Postgres gearbeitet habe, bin ich nun endlich dazu gekommen, einen etwas genaueren Blick auf die kostenbasierte Optimierung in diesem RDBMS zu werfen, und (more...)

Function Based Indexes und Skip Scans

Zur Vervollständigung des Titels müsste hier eigentlich nur noch stehen: ... funktionieren zusammen nicht. Oder vielleicht etwas ausführlicher: für Function Based Indexes ist der Zugriff über Index Skip Scan nicht möglich. Untersucht hat den Fall Jonathan Lewis, ausgehend von einem Thread im OTN Forum. Dabei ist das Problem vermutlich recht alt, spielt praktisch aber vermutlich selten eine größere Rolle.

Fehlende Baseline-Informationen im AWR

Dominic Brooks weist in seinem Blog darauf hin, dass die Verwendung von SQL Plan Baselines von DBMS_XPLAN.DISPLAY_CURSOR explizit erwähnt wird, in den Angaben von DBMS_XPLAN.DISPLAY_AWR aber fehlt. Seine Untersuchung enthält neben einer umfassenden Beschreibung des Analysevorgehens auch noch einen recht komplizierten Workaround, bei der der PHV2-Wert (also Plan Hash Value 2) aus der OTHER_XML-Spalte von DBA_HIST_SQL_PLAN mit dem entsprechenden Wert in SYS.SQLOBJ$ gejoint wird und auch noch weitere AWR-Tabellen dazugenommen werden, um (more...)

Aufrunden zur nächsten Zehnerpotenz

Ein kleiner Ausflug in die Welt der nicht ganz so hohen Mathematik: wie berechne ich die nächst höhere Zehnerpotenz zu einem gegebenen Wert mit Datenbankmitteln? Mit fiel dazu nichts Besseres ein als das Aufrunden des Ergebnisses der log-Funktion zum gegebenen Wert und die Verwendung dieses aufgerundeten Ergebnisses als Exponent zur Basis 10. Hier die Varianten für postgres und Oracle:

-- postgres
dbadmin=# select 10 ^ ceiling(log(4711)) round_up;
round_up
----------
10000

-- Oracle
SQL> select power(10, (more...)