Обложка канала

Oracle Developer👨🏻‍💻

Все о разработке в СУБД "Oracle" SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое.

Oracle Developer👨🏻‍💻

3 года назад
Открыть в
Восстанавливаем текст запроса. Анализ Последовательность выполнения шагов: 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