dual
Таблица «работает» почти так, как любые другие настольные работы: это таблица , из которой вы можете выбрать записи.
Это означает, например, что вы можете описать таблицу. Здесь, в SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Итак, таблица имеет один столбец, dummy
который называется varchar2(1)
.
В таблице есть одна запись (по крайней мере, если с ней никто не возится):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Таким образом, чтобы получить такое же поведение, dual2
как у вас dual
, вы должны вставить одну запись в двойную. Еще лучше, создайте его с помощью create table as select
(ctas):
SQL> create table dual2 as select * from dual;
Теперь ваш запрос работает:
SQL> select 4*5 from dual2;
4*5
----------
20
Ранее я говорил, что dual почти работает как любой другой стол. Итак, когда он не работает, как любой другой стол?
Он ведет себя по-другому, если не выбрано значение из самой таблицы. Опять же, с вашими запросами, я позволю Oracle объяснить их ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... чтобы увидеть, как осуществляется доступ к таблице:
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 |
-------------------------------------------------------------------
Видно, что заявление делает full table access
на dual2
.
Теперь то же самое с 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 |
-----------------------------------------------------------------
В этом случае dual
таблица ведет себя по-разному: значение dummy
не требуется, поэтому выполняется fast dual
операция, чтобы экземпляр не считывал фактическое значение на диске.