таблица dual

 

 

this article in English

 

Таблица dual очень проста. Она состоит из одного поля и содержит одно значение.

 

SQL> desc dual
Name                                      Null?    Type                      
----------------------------------------- -------- ----------------------------
DUMMY                                              VARCHAR2(1)                 

SQL> select * from dual;

D
-
X

Однако это значение никого не интересует. Таблица используется для получения данных, не имеющих отношения к dual. Например:

SQL> select user from dual;

USER
------------------------------
SCOTT

Чтобы получить значение user, мы с таким же успехом могли бы выполнить запрос

select user from emp where rownum <=1

Dual используется для таких выборок просто потому, что она всегда существует. Это объект под пользователем sys и он появляется при создании базы. И никто (за исключением любопытных DBA) не может его изменить. Однако, если задаться целью поиграться с dual (исключительно на тестовой базе), то можно обнаружить интересные вещи:

SQL> connect / as sysdba;
Connected.
SQL> insert into dual values('X');

1 row created.

SQL> insert into dual values('X');

1 row created.

SQL> select count(*) from dual;

  COUNT(*)
----------
         3

SQL> select * from dual;

D
-
X

Несмотря на то, что dual теперь содержит 3 строки, select выбирает только одну. Что это -- у базы "поехала крыша" от того, что мы внесли изменения в словарь (ведь формально dual -- часть словаря)?
Строго говоря, нет.

Однако, продолжим:

SQL> delete from dual;

1 row deleted.

SQL> select * from dual;

D
-
X

SQL> select count(*) from dual;

  COUNT(*)
----------
         2

Мы хотели удалить все строки из dual, но удалилась только одна...

Объяснение этому следующее: оптимизатор подразумевает, что таблица dual в любых условиях будет содержать только одну строку.

Впрочем, в каком-то смысле, dual не совсем обычная таблица. Вот пример:

SQL> select * from dual;
D
-
X
1 row selected.

SQL> ????????????????????;
Statement processed.

SQL> select * from dual;
ADDR     INDX       INST_ID    D
-------- ---------- ---------- -
26683298          0          1 X
1 row selected.

Что за магическая команда была выполнена, которая привела к таким изменениям в таблице dual?

Ответ: alter database close.

Дело здесь вот в чём: RMAN'у нужен доступ к dual даже когда база закрыта, поэтому при закрытии базы dual остаётся доступна, но с изменённой структурой и содержимым.

 

В конце нашей коротенькой заметки хочется повторить следующее: помните, что таблица dual -- часть системного словаря и Вы ни в коем случае не должны её каким-либо образом изменять на базе, где работают пользователи.