Optimizer-Features unterschiedlicher Oracle-Versionen vergleichen

Nigel Bayliss stellt im Blog der Oracle Optimizer Entwicklung ein nützliches Skript vor, mit dessen Hilfe man die Optimizer Features unterschiedlicher Oracle Releases vergleichen kann. Das Skript legt diverse Hilfstabellen an und greift auf v$session_fix_control, sys.x$ksppi und sys.x$ksppcv zu, für die man demnach Lesezugriff benötigt. Kann man natürlich auch von Hand machen, aber ein passendes Skript macht dergleichen komfortabler.

Locks zur Sicherstellung referentieller Integrität

Jonathan Lewis wiederholt in seinem Blog zur Zeit allerlei Erläuterungen, die er schon häufiger gegeben hat, und ich wiederhole hier dann noch mal die Punkte, die es bisher trotz Wiederholung noch nicht bis in meinen aktiven Wissensbestand geschafft hatten (sondern nur eine vage Erinnerung aufrufen). Einer dieser Punkte betrifft das Verhalten der Locks zur Gewährleistung referentieller Integrität, die als RI Locks bezeichnet werden. Dabei skizziert der Autor folgendes Szenario:
  • ein Datensatz wird in eine Parent-Tabelle (more...)

Wann ist ein Full Table Scan billiger als ein Index Fast Full Scan?

Und seit wann verwende ich in meinen Überschriften Fragezeichen? Fragen über Fragen. Aber eigentlich ist der Fall, den Jonathan Lewis in seinem aktuellen Blog-Artikel beschreibt, ebenso überschaubar wie erinnerungswürdig. Seine Fragen darin lauten: wieso werden die Kosten eines Full Table Scans auf einer Tabelle vom Optimizer als niedriger berechnet als die Kosten für den Index Fast Full Scan auf einem Index der Tabelle und warum ist der Index Fast Full Scan trotzdem effizienter in Hinblick (more...)

Materialized View Fast Refresh und Data Clustering

Zur Abwechslung kann ich hier mal wieder eine selbst erlebte Geschichte erzählen: am letzten Wochenende habe ich ältere historischen Daten aus den Aggregationstabellen eines Data Warehouses (11.2) entfernt, was den Neuaufbau diverser Materialized Views erforderlich machte. Diese Materialized Views sind auf verschiedenen Ebenen der Zeitachse definiert: für Wochen, Monate und Jahre, wobei die beiden ersten Gruppen range partitioniert sind, während für die Jahres-Ebene keine Partitionierung eingerichtet wurde: vermutlich, weil in der Regel nur wenige (more...)

Extended Statistics und CHAR Spalten

Vor Problemen bei der Verwendung von Extended Statistics - also Statistiken für mehrere (in der Regel korrelierte) Spalten, die intern über eine virtuelle Spalte abgebildet werden - warnt Jonathan Lewis in seinem jüngsten Sratchpad-Artikel. Der Hintergrund des Problems ist folgender: für eine einzelne CHAR-Spalte (in diesem Fall CHAR(2)) mit Histogram ist der Optimizer klug genug zu erkennen, das Blanks, die am Ende eines zum Vergleich herangezogenen Literals angehängt werden, keinen Einfluß auf die Selektivität des (more...)

Mustererkennung mit MATCH_RECOGNIZE in 12c

Keith Laker hat im Data Warehouse Insider Blog eine Artikelserie begonnen, die sich mit der Verwendung des MATCH_RECOGNIZE Features in 12c beschäftigt. Ich will jetzt nicht behaupten, dass ich die Artikel umfassend wiedergeben würde (ja nicht einmal, dass ich sie komplett gelesen hätte), aber sie wären sicherlich ein sehr nützlicher Einstieg, sollte ich gelegentlich auf die Idee kommen, das Feature irgendwo einzusetzen. In erster Näherung greife ich hier aber nur die Zusammanfassungs-Abschnitte am jeweiligen Artikelende (more...)

Neue Transformation “Group-by and Aggregation Elimination” in 12.1.0.2

Im Blog der Optimizer-Entwickler hat Nigel Bayliss eine Optimizer-Transformation vorgestellt, die in 12.1.0.2 eingeführt wurde und den Namen "Group-by and Aggregation Elimination" trägt. Was die Transformation leistet, ist Folgendes: wenn eine Query mit Gruppierung und aggregierenden Funktionen auf einer Inline-View basiert, die ihrerseits wieder eine Gruppierung und aggregierende Funktionen enthält, dann kann der Optimizer die beiden Gruppierungsschritte zusammenfassen. Das klingt so simpel, wie es in den Beispielen des Artikels auch aussieht: in (more...)

STRING_SPLIT im SQL Server 2016

Vor einiger Zeit habe ich in der Sektion database ideas bei OTN folgenden Wunsch geäußert: a string splitting function like SPLIT_PART in postgres. SPLIT_PART erhält als Argumente einen String und einen Delimiter, zerlegt den String an den Positionen der Delimiter-Zeichen in Substrings und liefert den n-ten Teilstring:

SELECT SPLIT_PART('A;B;C;D', ';', 2);
split_part
-----------
B

Das ist sicherlich keine höhere Magie und kann in SQL auf verschiedenen Wegen erreicht werden (etwa durch den Einsatz regulärer Ausdrücke), (more...)

Massendatenlöschungen

Ich werde nachlässig: auf der Suche nach meiner Zusammenfassung der ersten beiden Teile von Jonathan Lewis AllThingsOracle-Serie zu Massendatenlöschungen ist mir aufgefallen, dass ich dazu keine Zusammenfassungen geschrieben habe. Aber das lässt sich ja ändern: 

Massive Deletes – Part 1: beschäftigt sich zunächst mit strategischen und taktischen Fragen bei der Löschung von Massendaten. Auf der strategischen Ebene liegen Fragen nach der Zielsetzung der Löschung: was verspricht man sich davon und lohnt sich der Aufwand (more...)

PL/SQL Fehlerbehandlung

Ja, es ist richtig: meine Einträge hier werden in letzter Zeit kürzer und kürzer. Daran werde ich aber auch heute nichts ändern, denn eigentlich will ich gerade nur einen Link unterbringen: Steven Feuerstein listet in seinem Artikel Nine Good-to-Knows about PL/SQL Error Management- nun ja: neun interessante Punkte auf, die man beim Exception Handling in PL/SQL berücksichtigen sollte. Zu den wichtigsten Hinweisen gehören aus meiner Sicht:
  • "An exception raised does not automatically roll back (more...)

Begriffsbestimmung: deprecated und desupported

Mike Dietrich erklärt die Unterschiede der Konzepte deprecated und desupported:
Deprecated is a signal that something may disappear in the future and does not get enhanced anymore. No activity required except of taking note for your future plans. Desupported means that we don't fix anything anymore for a desupported feature or product - and it may even disappear. But often desupported features are still there and can be used on your own risk only.
Diese (more...)

Parameter Vorschläge in 12c

Vor ein paar Wochen hatte Mike Dietrich (in seinem ausgesprochen lesenswerten Blog zu den Themen upgrades and migrations) einen Artikel mit interessanten Parameter-Vorschlägen für 12c veröffentlicht, diesen aber rasch wieder aus dem Verkehr gezogen, weil es anscheinend Oracle intern gewisse Unstimmigkeiten darüber gab, ob man z.B. den Einsatz von underscore Parametern (außerhalb von Support-Fällen) überhaupt als Lösungen für Performance-Probleme vorschlagen sollte. An Stelle dieses initialen Artikels (dessen Vorschläge mir ausgesprochen plausibel vorgekommen waren) hat der (more...)

Full Table Scan in umgekehrter Block-Reihenfolge

Für mich völlig neu war der folgende Hinweis aus dem aktuellen Quiz-Artikel von Jonathan Lewis: mit Hilfe des - undokumentierten - Events 10460 kann man dafür sorgen, dass ein Full Table Scan des Blocks einer Tabelle in absteigender Reihenfolge liest, also beginnend mit dem letzten Block der Tabelle. Unter bestimmten Umständen könnte dieses veränderte Verhalten nützlich sein, etwa um ora-1555-Fehlern aus dem Weg zu gehen. Aber da das Event nicht dokumentiert ist, gehört das (more...)

Falsche Ergebnisse durch Partitions-Operationen “without validation”

Als Ergebnis einer Oracle-L-Diskussion hat Jonathan Lewis einen Artikel veröffentlicht, der einen Fall beschreibt, in dem der Einsatz eines Index-Hints ein falsches Ergebnis liefert, ohne dass dieses Verhalten als Oracle-Bug zu betrachten wäre. Während der Zugriff ohne den Index-Hint einen Full Table Scan mit Partition Pruning mit sich bringt, der die relevanten Daten nur aus der korrekten Partition liest, führt der Zugriff über den Index (ohne folgenden Tabellen-Zugriff) dazu, dass ein zusätzlicher Datensatz zurückgeliefert wird, (more...)

postgres: Analyse von page-Inhalten mit pageinspect

Mit einer gewissen Regelmäßigkeit beklage ich mich darüber, dass postgres bei der Instrumentierung nicht ganz das Niveau der großen kommerziellen Konkurrenz erreicht. Einerseits ist das wohl nicht falsch, andererseits ist mir aber auch klar, dass mir da zum Teil auch einfach Informationen fehlen. In dieser Woche wurde ich beispielsweise auf die Extension pageinspect hingewiesen, mir deren Hilfe man in postgres die Inhalte der pages von Tabellen und Indizes untersuchen kann - also das Äquivalent zur (more...)

Parallel DML und Buffered Operations

In der letzten Woche musste ich in möglichst kurzer Zeit (und im zum Teil weiter laufenden Betrieb) eine größere Zahl von Aggregationstabellen neu aufbauen und möglicherweise hätte ich dabei Zeit sparen können, wenn ich bei der Abarbeitung meines Blog-Readers nicht so weit im Rückstand wäre. Immerhin hat Jonathan Lewis zuletzt ein Verhalten beschrieben, das mir unter Umständen ein paar Anregungen geliefert hätte. In seinem Beispiel erfolgte eine CTAS-Operation in 4 min, während eine entsprechende INSERT (more...)

Zerlegung von Tabellen in rowid ranges

Stew Ashton ist derzeit für einen signifikanten Anteil der ungelesen in meinem Blog-Reader wartenden Artikel verantwortlich, da er gerade eine vielteilige Serie zum Thema "Chunking tables" veröffentlicht hat (veranlasst durch eine entsprechende OTN-Anfrage von Jonathan Lewis bzw. White paper Bezugnahme von Bryn Llewellyn). Die genaue Anzahl der Artikel lasse ich aus, um diese Einleitung generisch zu halten und spätere Korrekturen der Anzahl vermeiden zu können. Freundlicherweise pflegt der Autor im ersten Artikel eine Liste der (more...)

Erläuterungen zum Nested Loops Join

Nikolay Savvinov hat zuletzt in seinem Blog eine interessante Artikelserie zum Verhalten des Nested Loops Join veröffentlicht und dankenswerterweise die Ergebnisse und die Links noch einmal in einem summary zusammengefasst. Und diese Zusammenfassung fasse ich jetzt hier zusammen:
  • der Nested Loops Join (NL Join) ist der einfachste Join-Mechanismus in Oracle. Er liest die Daten einer (driving) row source und testet die Ergebnisse gegen die zweite row source (probe-Zugriff, üblicherweise via Index lookup). Da das Verfahren (more...)

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