Join mit Datums-Bereichen

Wenn man mit SQL arbeitet, dann gehört die Behandlung von Datumsintervallen zu den Themen mit eher beschränktem Unterhaltungswert. Insofern ist es sehr nützlich, dass Stew Ashton eine Artikelserie veröffentlicht hat, in der er diverse Spezialfälle genauer beleuchtet, mit denen man in diesem Kontext konfrontiert werden kann:

Zeitmessung im Oracle Wait Interface

Frits Hoogland gehört zu den Autoren, bei denen mir die plausible Zusammenfassung ihrer Artikel große Mühe bereitet - was zunächst damit zu tun hat, dass sich diese Artikel häufig sehr intensiv mit OS-Fragestellungen beschäftigen und dorthin kann ich nur in beschränktem Umfang folgen. Diesmal aber hat der Herr Hooglands einen Artikel veröffentlicht, der sich mit der Umstellung der für die Zeitmessung im Wait Interface verwendeten Timer-Funktion beschäftigt - und da will ich mal wieder mein (more...)

OPT_ESTIMATE-Hint für Materialized View Fast Refresh

Die folgende Beobachtung verdanke ich Randolf Geist, der mir auf meine Anfrage im OTN-Forum General Database Discussions den entscheidenden Hinweis gegeben hat. Beim Fast Refresh für Materialized Views in 11g ergeben sich regelmäßig Merge-Statements der folgenden Form:

/* MV_REFRESH (MRG) */ 
MERGE INTO "TEST"."T_MV" "SNA$"
USING (SELECT /*+ OPT_ESTIMATE(QUERY_BLOCK MAX=1000) */

Grunsätzlich sind die zugehörigen Mechanismen bekannt - insbesondere Alberto Dell'Era hat dazu in seinem Blog umfassende Erläuterungen geliefert -, aber zum enthaltenen OPT_ESTIMATE-Hint (more...)

Zur Semantik der Statistik “table scans (long tables)”

Der aktuelle Beitrag im Scratchpad von Jonathan Lewis hat ein wenig an seine alten Quiz-Night Artikel angeschlossen und mir eine Erwähnung eingetragen:
Martin Preiss (see comments) has been working hard to investigate this, and managed to produce a couple more variations in statistics for 'the same' problem.
Ganz so hart war die Arbeit nicht, aber überraschend war das Ergebnis für mich allemal. Interessant ist zunächst, dass sich zwar Angaben für die Statistiken "table scans (short (more...)

Erforderliche Leseoperationen bei der Anlage eines Primary Keys

Ein recht überraschendes Verhalten bei der Constraint-Aktivierung spricht Jonathan Lewis in einem aktuellen Artikel an: wenn man einen mehrspaltigen Primary Key auf einer Tabelle anlegt, auf der zuvor für die betroffenen Spalten noch keine NOT NULL Constraints existierten, dann muss Oracle für jede einzelne Spalte einen Full Table Scan durchführen, um zu prüfen, dass die Spalten tatsächlich keine NULL-Werte enthalten. Anschließend ist ein weiterer Full Table Scan erforderlich, um die Daten für die Index-Anlage zu (more...)

Extended Statistics und Join Cardinality

Vor ein paar Wochen hat Jonathan Lewis einen recht wichtigen Hinweis für den Einsatz von Extended Statistics (also Statistiken für eine Spaltengruppe, die vorhandene Korrelationseffekte bestimmbar machen - und intern über eine virtuelle Spalte abgebildet sind) zur Korrektur von abwegigen Schätzungen bei (equality) Joins über mehrere Spalten geliefert: um hier brauchbare Kardinalitäten zu bekommen, muss man die Extended Statistics auf beiden Seiten des Joins anlegen. Legt man sie nur auf einer Seite an, so ändert (more...)

Indizes und Inittrans

Zur Ablenkung hat Richard Foote zuletzt einen Artikel abgeschlossen, in dem er sich mit der Rolle des inittrans-Attributs für Tabellen und Indizes auseinandersetzt. Grundsätzlich bestimmt dieses Attribut, wie viele Transaktions-Slots initial in der ITL (= Interested Transaction List) eines Tabellen-, Index- oder Cluster-Blocks bereitgestellt werden - und jede Operation, die eine Änderung an einem Block durchführen will, muss sich in einen solchen Slot eintragen. Für Tabellen-Blocks kann das Fehlen eines solchen Slots zu hängenden Transaktionen (more...)

Löschung von Spalten

Mir ist durchaus klar, dass sich ein großer Teil meiner Beiträge hier auf die (verkürzende und manchmal sinnentstellende) Paraphrase der Artikel von Jonathan Lewis beschränkt. Aber an einführenden Sätzen wie den folgenden aus dem Artikel Dropping Columns, den der Herr Lewis gerade bei AllThingsOracle veröffentlicht hat, komme ich einfach nicht vorbei:
One of the bugs that came up on 9th Jan was described as: “Bug 18700681 : DROP COLUMNS USING ALTER TABLE VERY SLOW”. (more...)

ANSI Join Syntax vs. Oracle Join Syntax

Neben einem aktuellen Beispiel liefert Jonathan Lewis in seinem Blog eine sehr schöne Erklärung für die Tatsache, dass die ANSI Join Syntax gegenüber der Oracle Join Syntax noch immer im Nachteil ist:
In almost all cases the SQL you write using the ANSI standard syntax is tranformed into a statement using Oracle’s original syntax before being optimised – and there are still odd cases where the translation is not ideal. This can result in poor (more...)

Outer Join Beschränkungen in 12c

Einige interessante Beobachtungen zum Thema "Outer Joins in traditioneller Syntax  (aka Oracle-Join-Syntax) " - also mit Verwendung des + Operators statt des OUTER JOIN Schlüsselworts (aka ANSI-Join-Syntax) hat Philipp Salvisberg vor kurzem in seinem Blog zusammengestellt. Demnach sind die relevanten inhaltlichen Einschränkungen, die den + Operator in älteren Releases betrafen, in 12.1.0.2 alle verschwunden: insbesondere "ORA-01417: a table may be outer joined to at most one other table" und "ORA-01719: outer join operator (more...)

Langsamer Zugriff auf v$sql

Ein ganz wohlfeiler Trick, um in diesem Jahr noch auf 94 Blog-Einträge zu kommen - aber keine Angst: 100 werden es diesmal nicht mehr. Kurz vor Weihnachten habe ich im OTN-Forum General Database einen Fall vorgestellt, in dem der Zugriff auf eine eigentlich sehr übersichtliche dynamische Performance-View v$sql (mit kaum mehr als 2000 Einträgen) stabil 25 Sekunden dauert. Dabei sind anscheinend keine Waits im Spiel, sondern es wird fast ausschließlich CPU verbrannt. Trotz zahlreicher sachdienlicher (more...)

Table Expansion Bug mit Interval Partitioning

Als das Interval Partitioning in 11g eingeführt wurde, schien mir das eine der besten Ideen gewesen zu sein, die Oracle seit Einführung der Partitionierung eingefallen waren. Leider hat sich im Verlauf der Zeit herausgestellt, dass die Implementierung eine ziemliche große Zahl von Problemen hervorgerufen hat, von denen mir erstaunlich viele im Rahmen meiner eigenen Arbeit begegnet sind. Einen weiteren bizarren Bug, der in diesem Zusammenhang auftreten kann, hat Jonathan Lewis vor kurzem beschrieben: in 12c (more...)

AWR Snapshots vergleichen

Wieder nur ein Link: diesmal auf einen Artikel von Kyle Hailey, der erläutert, wie zwei AWR-Snapshots miteinander vergleicht. Wenn beide Snapshots im im gleichen AWR-Repository liegen, ist dafür nur ein Aufruf der table function dbms_workload_repository.awr_diff_report_text erforderlich (bzw. von dbms_workload_repository.awr_diff_report_html, wenn man die HTML-Version vorzieht). Darüber hinaus hat der Herr Hailey aber noch ein Shell-Skript awrdiff.sh definiert, das es erlaubt textuelle AWR-Reports aus unterschiedlichen Quellen zu vergleichen.

Views für die Postgres Performance Analyse

Nur ein Link auf eine sehr nützliche Grafik, in der Alexey Lesovsky zeigt, welche interne View jeweils verwendet werden kann um bestimmte Performance-Fragestellungen zu beantworten. Sollte ich mir irgendwo an die Wand hängen.

Fünf wichtige Optimizer Hints

Jonathan Lewis hat in seinem Blog eine Zusammenfassung der wichtigsten Punkte seiner DOAG-Präsentation Five Hints for Optimising SQL veröffentlicht (was ich sehr erfreulich finde, da ich den Vortrag natürlich nicht gehört habe, so wie alle Vorträge, die in den letzten zehn Jahren bei nationalen und internationalen Konferenzen gehalten wurden). Dabei beginnt er mit dem üblichen Hinweis, dass Hints normalerweise im Produktivsystem zu vermeiden und als Ultima Ratio zu betrachten sind. Und dass von den 332 (more...)

Nutzlose und weniger nutzlose METHOD_OPT-Angaben

Da ich hier zuletzt fast nur noch Links kommentiert habe, zur Abwechslung noch mal ein bisschen was Praktisches. Im OTN-Forum wurde heute die Frage gestellt, wieso dbms_stats.gather_table_stats auf den nicht dokumentierten Parameter-Wert "FOR ALL INDEXES" nicht mit einem Fehler reagiert. Meine Antwort darauf lautet: keine Ahnung, aber er ist noch gefährlicher als "FOR ALL INDEXED COLUMNS":

drop table t;
create table t
as
select rownum id
, mod(rownum, 2) col1
, mod(rownum, 5) col2
(more...)

Korrigierte Histogramm-Statistiken im SQL Server anlegen

Nachdem ich viele Jahre lang Tom Kytes Mantra wiederholt habe, dass alle RDBMS unterschiedlich sind und man die Unterschiede kennen muss, um sinnvoll mit den Systemen umzugehen, behaupte ich in jüngerer Vergangenheit immer häufiger, dass die relationalen Datenbanken im Prinzip alle ziemlich ähnlich sind und sich in mancher Hinsicht immer ähnlicher werden. In jedem Fall bin ich immer wieder froh, wenn ich neue Gemeinsamkeiten feststelle, so etwa auch diese hier: im immer wieder lesenswerten SQL (more...)

Ein griffiges Beispiel für Lateral Inline Views

Auf den Lateral Join, der in 12c eingeführt wurde, habe ich hier schon vor geraumer Zeit hingewiesen - aber was damals fehlte, war ein griffiges Beispiel dafür, was man damit eigentlich anstellen kann. Das hat nun Oren Nakdimon in Teil 7 seiner überaus lesenswerten Serie Write Less with More ergänzt. In seinem Beispiel wird eine Projekt-Tabelle mit einer last_days_to_show_in_reports Spalte vorgestellt, in der für die einzelnen Einträge unterschiedliche Zeiträume angegeben sind (als Anzahl von Tagen). (more...)

Ein Wait Interface für Postgres

Ein schöner Hinweis im Artikel Wait interface in PostgreSQL, dessen Autor ich leider nicht ohne weitere Recherche namentlich benennen kann: für postgres 9.4 gibt es eine von Ildus Kurbangaliev entwickelte Erweiterung pg_stat_wait, die möglicherweise in 9.6 Teil des Standards werden wird (aktuell aber noch ein Recompile von postgres und eine Einbindung via shared_preload_libraries erfordert). Nach der Installation stehen diverse Funktionen und Views zur Verfügung, die Informationen zu Events unterschiedlicher Typen bereitstellen (LWLocks, (more...)

Wait Event Analyse mit Flame Graphs

Luca Canali hat im Databases at CERN Blog wieder einmal eine detaillierte Analyse vorgestellt, in der er Flame Graphs mit Extended Stack Profiling verbindet und damit die Aussagen des Oracle Wait Interfaces näher beleuchtet. Der eigentliche Anlass der Untersuchung ist dabei die Beobachtung des Auftretens von Fällen, in denen die DB time größer ist als die Summe von CPU time und Wait time, was a) nicht vorkommen sollte und b) mit dem Einsatz moderner Storage (more...)