- dass man auf eine Join-View (also einfach eine View, die als Join mehrerer Basistabellen definiert ist), nur dann via rowid zugreifen kann, wenn eine der beteiligten Tabellen als "key-preserved table" gilt: "Oracle needs to be able to determine if there is at least one table in the view for which it is guaranteed that its rows can show up at most once in the result set of the view, which means that there need to be a minimum set of unique or primary key constraints at least if the view involves more than a single table. Furthermore Oracle needs to be able to determine this automatically, and depending on the complexity and expressions used, this is not always the case"
- die rowid eines Satzes der Join-View ist in einem solchen Fall die rowid der "key-preserved table".
- beim Zugriff über die rowid ist eine table elimination möglich: zugegriffen wird nur auf die "key-preserved table", da der Optimizer erkennt, dass er sich das Lesen der übrigen Tabellen der View sparen kann (jedenfalls bei den Constraint-Definitionen, die im Geist'schen Beispiel gewählt sind).
- mit relativ geringen Änderungen am Setup des Tests kann der Herr Geist einen "ORA-01410: invalid ROWID" hervorrufen: "Simple View Merging, another Query Transformation together with Join Elimination causes Oracle 11.2 to apply the ROWID to the wrong table in case multiple possible candidates for key-preserved tables exist."
- offenbar gibt es ein paar Varianten zum beschriebenen Bug.
Freitag, März 09, 2012
Join Views
Randolf Geist hat in seinem Blog vor einigen Tagen eine längere Erläuterung zum Thema Join Views, ROWIDs And Query Transformations veröffentlicht. Darin erfährt man unter anderem:
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen