таблица dual
Таблица 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 -- часть системного словаря и Вы ни в коем случае не должны её каким-либо образом изменять на базе, где работают пользователи.