Коллеги, всем привет! 👋
На связи Денис.
Пожалуй, самая популярная таблица в мире Oracle. Каждый из нас писал
select sysdate from dual сотни/тысячи раз. А вы когда-нибудь задумывались, что у неё под капотом? Давайте разберёмся.Что такое DUAL
🔹 Обычная таблица, владелец - SYS. Всем доступна через публичный синоним DUAL.
🔹 Одна колонка DUMMY типа VARCHAR2(1).
🔹 Одна строка со значением 'X'.
Нужна она для одного: в Oracle SELECT без FROM был невозможен. А посчитать выражение, вызвать функцию или взять NEXTVAL из последовательности хочется. Вот и берём «таблицу-пустышку», где гарантированно одна строка.
Кстати, почему DUAL, если строка одна? По известной байке, изначально в ней было две строки и её использовали, чтобы «удваивать» строки через декартово соединение. Потом строку оставили одну, а название прилипло 😄
Что происходит при выполнении
Сравните два плана:
explain plan for select sysdate from dual;
-- FAST DUAL
explain plan for select * from dual;
-- TABLE ACCESS FULL | DUAL
🔸 Если колонку DUMMY не трогаем, оптимизатор (с 10g) использует операцию FAST DUAL: в таблицу вообще не ходит, логических чтений ноль.
🔸 Если выбираем
* или DUMMY, Oracle честно читает таблицу полным сканом. Мелочь, но в цикле на миллион итераций уже не мелочь.Вывод простой:
select * from dual без нужды не пишите.Oracle 23ai: DUAL больше не обязателен
В 23ai FROM стал необязательным, наконец-то как в PostgreSQL:
select sysdate;
select 2 * 2;
select my_seq.nextval;
Старый вариант с
from dual тоже работает, ничего переписывать не нужно. Но в новом коде можно смело писать короче.А вы уже пишете SELECT без FROM на 23ai или всё ещё сидите на 19c? Поделитесь в чатике 💬
С вами был Денис. Всем лёгких запросов и одной строки в DUAL 🤝
#oracle #sql #dual #oracle23ai #оптимизация #фишки #Denis_Kivilev
Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀
📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads
RUTUBE
