Sonntag, Juli 14, 2013

Oracle 12c Installation unter Windows

Bei der Installation von Oracle 12c auf Oracle Linux hatte ich mich zuletzt an Tim Halls Anleitung orientiert, die das Thema erschöpfend behandelte. Wenn ich nach meinem Urlaub eine Installation unter Windows angehe, werde ich mich an Connor McDonalds Erläuterungen orientieren:
This is not a complete how-to, because I do not think its warranted…you pretty much click Next Next Next (which in itself is a credit to the product). But one thing to note – on the few machines I’ve installed it on, the installer gets to 100% and then just sits there for a LONG time. If you click on the "Details" button, you’ll see the location of the installer log. The long pause is in the "Saving Inventory" phase… So my advice is – just be patient. It will (eventually) get to the "Installation finished" message :-)
Viel mehr kann man zum Thema vermutlich nicht sagen...

Samstag, Juli 13, 2013

TOP n queries in Oracle 12c

Zur Vereinfachung der Handhabung von Paginierungs-Queries bietet Oracle 12c eine recht handliche neue Syntax an, in deren Zentrum das Schlüsselwort FETCH steht, das hinter der ORDER BY Klausel folgt und den Abschnitt der Ergebnismenge definiert, der geliefert werden soll. Bei Tim Hall findet man - wie üblich - eine detaillierte Beschreibung des Features, inclusive übersichtlicher Beispiele. Einige der einfachsten Fälle wären:

-- 12.1.0.1
drop table t;
create table t
as
select rownum id
  from dual
connect by level <= 20;

-- liefert nur die ersten fünf Datensätze
select id
  from t
 order by id
 fetch first 5 rows only;

        ID
----------
         1
         2
         3
         4
         5

-- überspringt fünf Datensätze und
-- liefert danach die folgenden fünf Datensätze
select id
  from t
 order by id
 offset 5 rows fetch first 5 rows only

        ID
----------
         6
         7
         8
         9
        10

-- liefert die ersten 20% der Datensätze
select id
  from t
 order by id
 fetch first 20 percent rows only

        ID
----------
         1
         2
         3
         4

Jonathan Lewis hat sich mit der internen Implementierung des Features beschäftigt und via CBO Trace die intern erzeugte Query bestimmt, die in solchen Fällen abgesetzt wird, und die neben den abgefragten Daten noch ein paar einfache analytische Funktionen (count, row_number, rank) enthält, die die Auswahl des gewünschten Abschnitts möglich machen. Es handelt sich also auch in diesem Fall nicht um schwarze Magie, sondern nur um eine syntaktische Abkürzung - was das Feature aber nicht weniger nützlich macht. Oder wie der Herr Lewis schreibt:
Oracle is basically taking a nice, easily readable syntax, and converting it behind the scenes to the sort of SQL we would once have written by hand. (That’s a good thing, of course – clarity of code does protect you from accidents, and it’s best if messy rewrites are handled by machines rather than error-prone people).
Zusätzlich hat Jonathan Lewis dann auch noch einen Artikel zum Verhalten des Features unter dem Einfluss von Parallelisierung geschrieben, der zeigt, dass die Verteilung der Arbeit auf die Slaves unter Umständen recht unausgewogen sein kann.

Mittwoch, Juli 10, 2013

Oracle Architektur Diagramm

Tom Kyte hat in der Vergangenheit häufiger den Vorschlag gemacht, die Sachkenntnis von Oracle-Job-Kandidaten dadurch zu überprüfen, dass man sie ein Diagramm der im Oracle Server verwendeten Elemente - also Dateien und Prozesse - auf ein Whiteboard zeichnen lässt. Angesichts des bei Asif Momen präsentierten Diagramms der Oracle University für das Release 12c würde ich an dieser Aufgabe zur Zeit wahrscheinlich scheitern ...

Sonntag, Juli 07, 2013

Identity Columns in Oracle 12c

In der letzten Woche habe ich beim Versuch, eine mit ORM-Mitteln (Hibernate, JPA) erzeugte Applikation von MySQL auf postgreSQL umzustellen, mal wieder feststellen müssen, dass die Unterschiede der RDBMS immer wieder an Stellen relevant werden, wo man sie nicht unbedingt erwartet - was ich vielleicht gelegentlich genauer ausführen werde. Um so schöner ist es, mal wieder festzustellen, dass sich die Konvergenztendenzen der großen RDBMS fortsetzen: nachdem der SQL Server vor kurzem endlich Sequenzen ins Repertoire aufgenommen hat, bringt Oracle 12c jetzt die Identity Column, was Tim Hall gewohnt detailliert beschreibt. Hier mein viel anspruchsloseres initiales Beispiel:

create table t (
    id number generated by default as identity
  , col1 number
);

insert into t(col1) values (1);
insert into t(col1) values (2);
insert into t(col1) values (42);

select * from t;

   ID       COL1
----- ----------
    1          1
    2          2
    3         42

Ob diese Annäherungen in irgendeinem Zusammenhang mit der kürzlich verkündeten Zusammenarbeit von Oracle und Microsoft stehen, weiß ich nicht - aber zweifellos erleichtern sie die Arbeit bei Portierungen.

Nachtrag 21.10.2013: Julian Dyke hat dem Feature einen längeren Artikel gewidmet, der vermutlich alles Wissenswerte zum Thema enthält.

Dienstag, Juli 02, 2013

Neue Features in 12c

Während ich mühsam meine erste 12c-Installation auf Oracle Linux 6 zum Laufen gebracht habe (den ausführlichen Anleitungen des erschütternd sorgfältigen Dr. Hall folgend), sind andere Leute schon intensiv dabei, die Features des neuen Releases zu untersuchen. Hier ein paar Verweise auf interessante Untersuchungen:
  • WITH Clause Enhancements in Oracle Database 12c Release 1 (12.1): worin der bereits angesprochene Tim Hall die interessante Option der Verwendung von Funktionen und Prozeduren in CTEs untersucht. Dabei ist scalar subquery caching möglich, aber deterministische Funktionen im With werden leider beim wiederholten Aufruf nicht in gleicher Weise optimiert wie entsprechende Stand-alone Funktionen, wie Jonathan Lewis (und der im zugehörigen Scratchpad-Artikel kommentierende Sayan Malakshinov, der im eigenen Blog auch noch auf mögliche Inkonsistenzen in den Ergebnissen hinweist) gezeigt hat.
  • 12c - SQL Text Expansion: Tom Kyte stellt die Funktion dbms_utility.expand_sql_text vor, die eine Ersetzung von View-Namen durch die zugrunde liegenden Definitionen in SQL-Queries durchführt. Auch VPD-Effekte lassen sich damit offenbar deutlich leichter analysieren, als das bisher der Fall war.
  • 12c - Utl_Call_Stack...: noch mal der Herr Kyte, diesmal mit einem Hinweis auf das Package UTL_CALL_STACK, das eine deutlich komfortablere Analyse von Aufrufhierarchien gestattet, als das die alten dbms_utility.format%-Routinen gestatteten.
  • 12c - Invisible Columns...: wieder der Herr Kyte (der endlich wieder so viele Artikel für seinen Blog schreibt, wie ich mir das wünsche) mit Informationen zum Thema unsichtbarer Spalten, die im SELECT * nicht erscheinen, aber explizit angesprochen werden können, was als simplere Variante zur Edition Based Redefinition - EBR verwendet werden kann. Interessant ist dabei auch der Hinweis (eines weiteren Artikels im gleichen Blog), dass das Setzen einer Spalte als invisible diese ans Ende der Spaltenliste verschiebt (was aber offenbar keine physikalische Reorganisation, sondern nur eine Metadaten-Änderung bedeutet).
  • 12c: Intro To Multiple Indexes On Same Column List (Repetition): Richard Foote liefert ein Beispiel für die (hier schon mal erwähnte) Möglichkeit, die gleiche Spalte oder Spaltenkombination mit mehreren Indizes zu versehen, von denen allerdings immer nur einer als visible definiert sein darf. In seinem Beispiel zeigt er die Ersetzung eines als non-unique definierten Index durch einen als unique definierten (andere Fälle könnten bitmap vs. b*tree oder partitioned vs. non-partitioned sein). Nachtrag 06.07.2013: ein Beispiel von Tom Kyte gibt's dazu inzwischen auch.
An dieser Stelle breche ich die Aufzählung willkürlich ab, obwohl es zuletzt noch jede Menge anderer interessanter Artikel zu neuen Features gab - denn das ist eine andere Geschichte, die ein andermal erzählt werden soll...

Nachtrag 17.07.2013: viel ist zum Thema inzwischen erschienen, aber erwähnen will ich nur den Überblick zu den neuen Features in 12c in der deutschen DBA Community, der bei der Vorstellung der neuen Errungenschaften weniger eklektisch vorgeht, als ich das an dieser Stelle getan habe.