TGViewer
Oracle Developer👨🏻‍💻 Oracle Developer👨🏻‍💻 @oracle_dbd · 3.43K subscribers
Post #1394 919
🕵️ Разбор: мистическое исчезновение соединения и таблицы из плана запроса

Коллеги, всем привет! 👋 На связи Денис.

В понедельник я показал вот этот запрос:
select t.*, d.department_id
from employees t
join departments d
on t.department_id = d.department_id

И план, в котором от таблицы DEPARTMENTS и самого JOIN не осталось ни следа.

И стало это следствием трансформации нашего запроса оптимизатором. Он применил Join Elimination (устранение соединения).
Короче говоря, оптимизатор посмотрел на запрос и понял: а зачем вообще идти в DEPARTMENTS?

Вот его логика по шагам
🔹Условие 1 - Foreign Key. Между EMPLOYEES.department_id и DEPARTMENTS.department_id есть FK-ограничение. Оптимизатор знает: для каждой строки из EMPLOYEES в DEPARTMENTS гарантированно найдется соответствующая запись.

🔹Условие 2 - мы не берем ничего нового. Колонка d.department_id, которую мы запрашиваем из второй таблицы - это тот же самый department_id, по которому идет джоин. Значение уже есть в первой таблице, дублировать смысла нет.

Вывод оптимизатора. JOIN не изменит ни количество строк, ни значения в результате. Он лишний. Убрать.

И вот тут самое интересное - оптимизатор не просто выкинул таблицу. Он ещё и добавил новый предикат, которого в исходном запросе не было:
filter("T"."DEPARTMENT_ID" IS NOT NULL)

Логика простая: INNER JOIN по определению отфильтровывает строки, где нет соответствия. Раз таблицы больше нет - оптимизатор сам добавил фильтр, который даёт тот же результат.

Вот и вся магия. Никакой мистики - просто оптимизатор сработал умнее, чем мы ожидали 🤷🏻‍♂️

——
Не забываем, что 13 августа в 19:00 МСК у нас пройдет вебинар по методам соединения таблиц.

Уже стало доброй традицией - самые стойкие и жадные до знаний получают еще допом интересную темку.

В этот раз будут такие:
1️⃣ Соединения в PostgreSQL - виды и как отображаются в планах.
2️⃣ Трассировка оптимизатора - как он принимает решения, на примере того самого Join Elimination, который мы сегодня разобрали.

Естественно, я расскажу ту тему, за которую проголосует большинство 🎁
Обязательно приходите и коллег своих приводите 😉

С вами был Денис. Всем предсказуемых планов запросов 🤝

#oracle #sql #оптимизация #performance #join #JoinElimination #plan #вебинар #oracledeveloper #Denis_Kivilev

Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀

📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads
RUTUBE
  • 🔥 14
More from @oracle_dbd
  1. Oct 14, 2026EXECUTE IMMEDIATE и конкатенация: страшная залепа 😱 Коллеги, всем привет! 👋 На связи Ден…
  2. Oct 12, 2026NO_DATA_FOUND, который не падает 🫥 Коллеги, всем привет! 👋 На связи Денис. Продолжаем те…
  3. Oct 9, 2026🎥 Index Scan vs Table Access Full: 4 чтения против 15 396 Коллеги, всем привет! 👋 На свя…
  4. Oct 7, 2026WHEN OTHERS THEN NULL - тихий убийца 🤫 Коллеги, всем привет! 👋 На связи Денис. Последние…
  5. Oct 6, 2026Один запрос - пять SQL_ID 🤷🏻‍♂️ Коллеги, всем привет! 👋 На связи Денис. Под постом про…
  6. Oct 4, 2026Семья - самое главное ✅ Друзья всем привет! Сегодня будет воскресный щитпостинг 😊 Не нрав…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →