Database Reference
In-Depth Information
Dieser Test-Case liefert 5 Sätze statt eines einzigen zurück. Das Hint UNNEST habe ich
speziell eingebaut, um Oracle zu einer Query-Transformation zu zwingen, die im realen
Fall gemacht wurde. Schauen wir jetzt, was für eine Query-Transformation Oracle anwen-
det:
Plan hash value: 263830440
----------------------------------------------------------------------------------------------
--------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem
| 1Mem | Used-Mem |
----------------------------------------------------------------------------------------------
--------------------
| 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.01 | 6 |
| | |
| 1 | HASH UNIQUE | | 1 | 1 | 5 |00:00:00.01 | 6 |
910K| 910K| 615K (0)|
| 2 | COUNT | | 1 | | 5 |00:00:00.01 | 6 |
| | |
|* 3 | HASH JOIN | | 1 | 5 | 5 |00:00:00.01 | 6 |
968K| 968K| 378K (0)|
|* 4 | TABLE ACCESS FULL| A | 1 | 1 | 1 |00:00:00.01 | 3 |
| | |
|* 5 | TABLE ACCESS FULL| B | 1 | 5 | 5 |00:00:00.01 | 3 |
| | |
----------------------------------------------------------------------------------------------
--------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A1"="B"."B1")
4 - filter("A1"=1)
5 - filter("B"."B1"=1)
Oracle transformiert die ursprüngliche SQL-Anweisung mit einem Subquery in einen
HASH JOIN. Normalerweise benutzt Oracle dafür einen SEMI JOIN. Den normalen Join
kann Oracle nicht in allen Fällen einsetzen, da dieser Join mehr Sätze produzieren kann.
Ich habe vermutet, dass Oracle diese Transformation anwendet, weil der DISTINCT Ope-
rator in der SQL-Anweisung vorhanden ist, da dieser Operator das Ergebnis des HASH
JOIN auf die richtige Menge reduziert. Das habe ich sofort geprüft:
Search WWH ::




Custom Search