Восстанавливаем текст запроса. Анализ
Последовательность выполнения шагов: 3, 2, 4, 1, 0 или 3, 2, 1, 4, 0 (как посмотреть на соединение).
1️⃣ Шаг 3. Происходит Range Scan индекса DEPT_LOCATION_IX.
Доступ происходит по предикату "D"."LOCATION_ID">1700 (звездочка в плане + predicate information)
2️⃣ Шаг 2. Выгребание строк по найденным Rowid (на шаге 3) из таблицы DEPARTMENTS
Почему без него никак? В индексе нет достаточного количества данных, чтобы выполнить последующее соединение и материализовать результат.
3️⃣ Шаг 4. NESTED LOOPS SEMI - полусоединение двух таблиц (ищется первое совпадение по предикатам соединения).
Используется в конструкциях типа exists/in.
Исходя из predicate information 4, соединение двух таблиц осуществляется по столбцам "D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID".
Отсюда же можно получить названия алиасов к таблицам - d/e.
4️⃣ Шаг 1. Доступ ко второй таблицы происходит по EMP_DEPARTMENT_IX.
5️⃣ Шаг 0. Происходит SELECT.
По этим данным никак нельзя понять название второй таблицы. Тут уж просто кругозор 🤷🏻♂️
Только ленивый или совсем новичок не щупал схему HR с набором табличек.
Название второй таблички - employees.
Даже, если не знаете, я думаю ничего страшного, если на собесе её назовете, хоть, tab2.
Итоговый запрос
select *
from hr.departments d
where d.location_id > 1700
and exists (select 1 from hr.employees e where d.department_id = e.department_id);
Минутка юмора
Подписчица канала, и мой экс-босс (Наташа, привет), прогнала задание через BingAI и получила текст запроса идентичный натуральному. Есть над чем задуматься 😉
Конечно, на собеседовании у вас не будет времени на это. Да и в работе, лучше понимать "что куда и как".
В своем курсе по оптимизации, я буду давать подобные темы 🎓
Понравилось? ставьте 👍
#решениезадачи #оптимизация
Oracle Developer