Die dual
Tabelle "funktioniert" fast genauso wie jede andere Tabelle: Es handelt sich um eine Tabelle, aus der Sie Datensätze auswählen können.
So können Sie beispielsweise die Tabelle beschreiben. Hier in SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Die Tabelle hat also eine Spalte mit dem Namen dummy
a varchar2(1)
.
Die Tabelle enthält standardmäßig einen Datensatz (zumindest, wenn niemand daran herumgespielt hat):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Um dasselbe Verhalten dual2
wie mit dual
zu erzielen, müssen Sie einen Datensatz in dual einfügen. Besser noch, erstelle es mit einem create table as select
(ctas):
SQL> create table dual2 as select * from dual;
Jetzt funktioniert Ihre Abfrage:
SQL> select 4*5 from dual2;
4*5
----------
20
Zuvor habe ich gesagt, dass Dual fast wie jeder andere Tisch funktioniert. Also, wenn es nicht funktioniert wie jede andere Tabelle?
Es verhält sich anders, wenn kein Wert aus der Tabelle selbst ausgewählt ist. Auch bei Ihren Fragen lasse ich Oracle erklären ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... um zu sehen, wie auf die Tabelle zugegriffen wird:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL2 | 1 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------
Es ist ersichtlich, dass die Anweisung a full table access
ondual2
.
Nun dasselbe mit dual
:
SQL> explain plan for select 4*5 from dual;
EXPLAIN PLAN ausgef³hrt.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
Hier dual
verhält sich die Tabelle anders: Der Wert von dummy
wird nicht benötigt, daher wird eine fast dual
Operation ausgeführt, damit die Instanz den tatsächlichen Wert auf der Festplatte nicht liest.