Freitag, März 27, 2015

ANSI Join Syntax und das 1000-Spalten-Limit

Mein Titel klingt mal wieder wie der Name einer eher lieblos fortgeschriebenen Krimi-Serie, aber wahrscheinlich gelingt es mir eher, den Eintrag über eine solche Überschrift wiederzufinden, als anhand des Titels ANSI expansion, den Jonathan Lewis seinem Artikel gegeben hat, den ich hier abkürzend nacherzähle. Worum es geht ist Folgendes: im OTN-Forum wurde ein gut beschriebener Testfall vorgelegt, in dem ein ANSI-Join (mit recht breiten Views) in 12c (aber nicht in 11g) einen Fehler "ORA-01792: maximum number of columns in a table or view is 1000" hervorruft - was insofern verwundert, als in der Select-Liste der Query nur auf die Spalten einer deutlich schmaleren Tabelle zugegriffen wird. Ersetzt man das "Select *" durch eine explizite Liste der zugehörigen Spalten, so tritt das Problem nicht auf, und auch die Umformung des ANSI-Joins in einen traditionellen Join (*) führt zu einer problemlosen Verarbeitung. Im Artikel erklärt der Herr Lewis die Hintergründe des Verhaltens, wobei er die neue Routine dbms_utility.expand_sql_text verwendet, um die in der Query verwendeten Views auf die zugrunde liegenden Objekte zurückzuführen. Dabei wird deutlich, dass das 1000-Spalten-Limit im Select-*-Fall beim Aufbau zwischengeschalteter Sub-Queries überschritten wird, die sämtliche Spalten der verwendeten Views enthalten, obwohl im Test auf oberster Ebene nur zwei Spalten relevant sind. Bei einer expliziten Adressierung der relevanten Spalten tritt der Effekt nicht auf. Dieses Problem hat dabei anscheinend keine Auswirkungen auf die internen Transformationen der Query: im CBO-Trace erscheint für alle Fälle ein simpler Join in klassischem Stil. Angesichts der Häufigkeit, mit der ANSI-Probleme im OTN-Forum erscheinen, komme ich allmählich zum Schluss, die traditionelle Join-Syntax wieder zu präferieren - obwohl die neue ANSI-Syntax manche Query deutlich lesbarer macht.

(*) Ich gelobe, mir in Zukunft die Hinweise darauf zu sparen, dass letztlich beide Join-Syntax-Varianten in (unterschiedlichen) ANSI-Standards enthalten sind.

Keine Kommentare:

Kommentar veröffentlichen