dual
Stół „działa” prawie tak, jak wszelkie inne prace stołowe: jest to tabela, z której można wybrać rekordy.
Oznacza to na przykład, że możesz opisać tabelę. Tutaj w SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Tak więc tabela ma jedną kolumnę o nazwie, dummy
która jest varchar2(1)
.
Tabela ma z założenia jeden rekord (przynajmniej jeśli nikt się nim nie bawił):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Tak więc, aby uzyskać takie samo zachowanie, dual2
jak w przypadku dual
, musisz wstawić jeden rekord do podwójnego. Jeszcze lepiej, utwórz go za pomocą create table as select
(ctas):
SQL> create table dual2 as select * from dual;
Teraz twoje zapytanie działa:
SQL> select 4*5 from dual2;
4*5
----------
20
Wcześniej powiedziałem, że dual działa prawie jak każdy inny stół. Więc kiedy to nie działa jak jakikolwiek inny stół?
Zachowuje się inaczej, jeśli nie wybrano żadnej wartości z samej tabeli. Znowu, dzięki twoim zapytaniom, pozwalam Oracle je wyjaśnić ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... aby zobaczyć, w jaki sposób można uzyskać dostęp do tabeli:
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 |
-------------------------------------------------------------------
Można zauważyć, że oświadczenie robi full table access
on dual2
.
Teraz to samo z 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 |
-----------------------------------------------------------------
W tym przypadku dual
tabela zachowuje się inaczej: wartość dummy
nie jest potrzebna, więc fast dual
wykonywana jest operacja, aby instancja nie odczytała rzeczywistej wartości na dysku.