У dual
стіл «працює» майже так, як будь-які інші настільні роботи: це таблиця , з якої ви можете вибрати записи.
Це означає, наприклад, ви можете описати таблицю. Тут, у SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Отже, у таблиці є один стовпець, названий dummy
яким - avarchar2(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
Раніше я говорив, що дуал майже працює, як і будь-який інший стіл. Отже, коли це не працює, як будь-який інший стіл?
Він поводиться по-різному, якщо не вибрано значення з самої таблиці. Знову з вашими запитами я дозволяю 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
виконується операція, щоб екземпляр не зчитував фактичне значення на диску.