Таблиця dual

Таблиця dual дуже проста. Вона складається з одного поля та містить одне значення.

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

Щоб отримати значення user, ми з таким самим успіхом могли б виконати запит

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

Незважаючи на те, що dual тепер містить 3 рядки, select вибирає лише один. Що це - у бази "поїхав дах" від того, що ми внесли зміни до словника (адже формально dual - частина словника)? Строго кажучи, ні.

Ми хотіли видалити всі рядки з dual, але вийшла тільки одна.

Пояснення цьому таке: оптимізатор передбачає, що таблиця dual у будь-яких умовах міститиме лише один рядок.

Втім, у сенсі, dual не зовсім проста таблиця. Ось приклад:

Що за магічна команда була виконана, яка призвела до таких змін у таблиці dual?

Відповідь:alter database close.

Справа тут ось у чому: RMAN'у потрібен доступ до dual навіть коли база закрита, тому при закритті бази dual залишається доступна, але зі зміненою структурою та вмістом.

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