String-Aggregation im SQL Server

Eine Funktionalität, die in Oracle und postgres schon seit längerer Zeit verfügbar ist, aber im SQL Server noch auf der (connect) Wunschliste steht, ist die String-Aggregation - also die Möglichkeit einer Gruppierung, bei der mehrere Elemente einer Gruppe in einem Feld konkateniert werden (also z.B. alle Mitarbeiter eines Departments in Oracles klassischer EMP-Tabelle). Für den SQL Server gibt es immerhin diverse Möglichkeiten, das Verhalten nachzubilden, und Aaron Bertrand stellt diese Varianten und ihr Verhalten (more...)

Commit-Korrekturen mit git

Hat nichts mit Datenbanken zu tun, sondern mit Versionsverwaltung: git benutze ich zwar schon seit einiger Zeit, habe es aber trotz ernsthafter Absichten nie geschafft, mir die Details ausreichend genau anzuschauen, um auf unerwartete Probleme angemessen reagieren zu können. Daher hat mir der Hinweis eines Kollegen auf den Artikel On undoing, fixing, or removing commits in git von Seth Robertson sehr geholfen, denn darin steht, was zu tun ist, wenn man sich in eine unglückliche (more...)

Neue Features in Postgres

Eine kleine Sammlung neuer Features, die in Postgres 9.4 eingeführt wurden bzw. in 9.5 eingeführt werden sollen - oder darin wünschenswert wären:
  • Craig Kerstiens hat dieser Tage seine Wunschliste mit neuen Features, die er gerne in Version 9.5 sehen würde, veröffentlicht. Auf Position 1 steht dabei das Upsert - aka MERGE - und das scheint auch mir die erstaunlichste Lücke im gegenwärtigen postgres-Funktionsumfang zu sein. Immerhin ist es seit Version 9.1 möglich, (more...)

Abgeleitete IS NOT NULL Prädikate

Jonathan Lewis weist (im Rahmen einer Quiz-Frage, die sehr schnell ihre Antwort fand) darauf hin, dass der Optimizer implizite IS NOT NULL Prädikate schon seit vielen Releases aus der Join-Bedingung ableiten kann (im Sinne von: wenn ein Join durchgeführt wird, kann die Join-Bedingung keine NULL-Werte enthalten haben).

drop table people

Wenn es bei xkcd einen Strip mit SQL-Queries gibt, muss er hier verlinkt werden - auch wenn's vielleicht eher um ein philosophisches Problem geht.

Definition von AWR Intervallen

Doug Burns hat dieser Tage in seinem Blog zwei Artikel zum Thema der Definition von AWR Intervallen veröffentlicht. Erinnerungswürdig scheinen mir dabei vor allem die folgenden beiden Punkte:

  • in einem produktiven System ist es sinnvoll, die Retention der AWR Snapshots auf einen deutlich höheren Wert als den default von 8 Tagen zu setzen (35-42 Tage oder gleich: unbegrenzt). 
  • weniger sinnvoll ist es, die AWR Intervalle selbst zu verkürzen: also vom Standard-Intervall von 1h auf (more...)

APPROX_COUNT_DISTINCT

Eigentlich stand auf meinem Erledigungszettel die Idee, eine kurze Untersuchung der in 12.1.0.2 neu eingeführten APPROX_COUNT_DISTINCT Funktion durchzuführen, mit deren Hilfe man die ungefähre Anzahl der distinkter Werte in einer Spalte effizient ermitteln können soll - aber Luca Canali hat gerade einen entsprechenden Artikel veröffentlicht und so genau wie der Herr Canali hätte ich mir den Fall ohnehin nicht angeschaut. Hingewiesen wird im Artikel unter anderem auf folgende Punkte:

ALTER INDEX … COMPUTE STATISTICS ist wirklich deprecated…

Im OTN-Forum wurde dieser Tage die Frage gestellt, ob nach einem Index-Aufbau ein expliziter Neuaufbau von Statistiken erforderlich ist. In einem Kommentar erwähnte ein Diskussionsteilnehmer sein Standardverfahren des Aufrufs von ALTER INDEX ... COMPUTE STATISTICS nach dem Index-Aufbau. Nun hatte ich eine relativ klare Vorstellung von den Unterschieden bei der Statistikerstellung unter Verwendung des (veralteten) ANALYZE-Kommandos (für Tabellen) und dem (aktuellen) Aufruf von DBMS_STATS.GATHER_TABLE - aber keine Ahnung, wie die Statistiken aussehen, die durch ALTER (more...)

SQL Server ETL mit T-SQL oder SSIS

Es ist schon eine Weile her, dass ich ernsthaft mit dem SQL Server gearbeitet habe - und ich bin mir nicht sicher, ob ich ernsthaft behaupten würde, je ernsthaft mit den SQL Server Integration Services (SSIS) gearbeitet zu haben. An Projekten, in denen SSIS eingesetzt wurde, war ich allerdings beteiligt, habe aber immer dafür plädiert, die SSIS in diesem Zusammenhang nur als Container für SQL-Operationen zu verwenden - ganz im Sinne eines älteren Artikels von (more...)

Visualisierung von Oracle-Performance Informationen

Als hoffnungsloser Laie in Sachen Visualisierung schaue ich immer wieder voller Erstaunen auf die Beispiele, die Kyle Hailey in seinem Blog unterbringt. Ich muss mal wieder neidvoll anerkennen: es gibt Fälle, in denen sqlplus nicht die optimale Repräsentation von Ergebnissen liefert.

Notizen zur In-Memory Option in Oracle 12c

Sie ist sicher das aufsehenerregendste Feature des gerade veröffentlichten Patch-Sets 12.1.0.2: die In-Memory Option. Wenn man das Marketing fragt, macht sie Zugriffe um den Faktor X schneller - wobei man für X so ziemlich jeden Wert einsetzen kann, der einem gerade einfällt: ein passendes Szenario dafür wird sich basteln lassen. Vor ein paar Tagen habe ich meinen Download des Patches durchgeführt, aber bis zur Installation bin ich noch nicht gekommen, daher bleiben (more...)

Patchset 12.1.0.2 veröffentlicht

Seit einigen Tagen ist das Patchset 12.1.0.2 für erste OS-Versionen verfügbar und einige der interessantesten Ergänzungen wurden bereits in diversen Artikeln vorgestellt - insbesondere natürlich die In-Memory-Option (für die verschiedentlich das Acronym IMDB verwendet wurde, was möglicherweise noch für Verwirrung sorgen wird). Auf den ersten Blick sieht es so aus, als wären insbesondere die Ergänzungen, die sich potentiell auf die Datenbank-Performance auswirken, sehr umfangreich - und man kann darüber spekulieren, warum derart (more...)

Korrektur der Join Cardinality

Laut Randolf Geist ist es "one of the most obvious weak spots of the optimizer: A filter on a table that is joined to another table that has a skewed value distribution in the FK column(s)." Der Satz ist die Antwort auf eine Frage im OTN-Forum, die ein recht kompaktes Beispiel enthielt, bei dem der Optimizer sich hinsichtlich der Cardinality eines Joins massiv verschätzt. Hier eine vereinfachte Version des einfachen Beispiels:

-- 11.2. (more...)

Einfügen von Zeilen aus Excel im SQL Developer

Dass der SQL Developer ein großartiges Tool ist, dem ich womöglich verfallen wäre, wenn ich meine Seele nicht an sqlplus verkauft hätte, habe ich vielleicht gelegentlich schon mal erwähnt. Ein in entsprechender Situation sehr nützliches Detail zeigt Jeff Smith in einem aktuellen Blog-Eintrag: die Möglichkeit, Daten aus Excel per Copy&Paste im SQL Developer in eine Tabelle einzufügen. Das zumindest kann ich mit sqlplus nicht durchführen...

Implizite Typ-Konvertierung und Index-Zugriff

Das Thema wurde sicherlich schon in diversen Blog-Einträgen erläutert - ich war aber zu faul, um danach zu suchen. Außerdem wollte ich hier mal wieder ein kleines Code-Beispiel unterbringen.

Um was es geht, ist Folgendes: Oracle sieht großzügig über fehlerhafte Typ-Angaben bei den Einschränkungen von Abfragen hinweg und korrigiert sie stillschweigend via implizite Typ-Umwandlung. Grundsätzlich ist das eine nette Geste, aber natürlich bringt das Verhalten gelegentlich auf Probleme mit sich. Unter anderem gibt es Situationen, (more...)

Charles Hooper über Troubleshooting Oracle Performance

Zu meinen für das laufende Jahr ernsthaft ins Auge gefassten Vorsätzen gehört es, eine Besprechung zum zweiten Band der Poetik des Aristoteles ... - ich wollte sagen: zur zweiten Auflage von Christian Antogninis Standardwerk Troubleshooting Oracle Performance zu schreiben. Da ich dazu aber noch ein paar Vorarbeiten zu leisten habe - zu denen die Lektüre des Buches zählt... -, beschränke ich mich vorläufig auf einen Link auf die umfangreiche und detaillierte (ich könnte auch sagen: geradezu einschüchternde) Besprechung (more...)

Partitial Join Evaluation in 12c

Franck Pachot erläutert im dbi service Blog eine interessante Transformation, die in 12c eingeführt wurde: die Partial Join Evaluation (PJE). Diese Option erlaubt es dem Optimizer, einen Join, der eine distinkte Ergebnismenge liefern soll, intern in einen Semi-Join umzuwandeln und dadurch die Prüfung zu beenden, wenn ein erster Datensatz gefunden wird, der die Bedingung erfüllt. Seine Test-Query:
select distinct deptno,dname from dept join emp using(deptno)
wird in 11g über einen HASH JOIN mit folgendem HASH (more...)

Partion Views in 11.2

Zu den ersten Ergebnissen, die Google bei der Suche nach "Partition View" liefert, gehört Oracle7 Tuning, release 7.3.3. Jenes Release 7.3 wurde 1996 veröffentlicht und seit mehr als zehn Jahren wird man bei Oracle nicht müde zu betonen, dass die "Partition Views" als Feature deprecated sind - aber offenbar funktionieren sie auch in Release 11.2 noch immer, wie ich heute beim Durchspielen eines im OTN-Forum vorgestellten Beispiels feststellen konnte. Ich spare (more...)

SQL Plan Baselines und Parse Probleme

Jonathan Lewis erinnert in seinem Blog daran, dass Baselines keinen positiven Effekt auf Parse-Probleme haben: "The first thing that the optimizer does for a query with a stored sql plan baseline is to optimize it as if the baseline did not exist." In solchen Fällen sind SQL Profiles, SQL Patches oder einfache Query-Hints möglicherweise eine bessere Lösung.

Default-Werte für Datumsintervallendpunkte

Stew Ashton, der sich in seinem Blog in der Regel mit komplexen SQL-Queries beschäftigt, hält dort ein Plädoyer für den Verzicht auf NULL-Werte bei der Angabe der minimalen und maximalen Werte für Datumsintervalle. Stattdessen spricht er sich für die Verwendung der klassischen Minimal- und Maximalwerte aus, die durch den Oracle Datentyp DATE nahegelegt werden, also den 01.01.4712 B.C. (ich nehme an, das ist Oracles Version von der Erschaffung der Welt) und (more...)