Задача о трансформации запроса
Постановку смотрите в посте вторника.
Немного теоретической части
Любой запрос при hard parse проходит через стадию “оптимизации” для построения плана запроса. Одним из этапов оптимизации является трансформация запроса.
Например, запрос
select * from tab1 where col1 = … or col2 = …
при определенных условиях будет преобразован в запрос вида:
select * from tab1 where col1 = …
union all
select * from tab1 where col2 = … and col1 not in ...
Первоначальный запрос, в конечном итоге, может отличаться от того, что будет выполняться. В документации отражены некоторые возможные трансформации.
Возвращаясь к нашему примеру
Можно предположить, что таблица departments была исключена из запроса на этапе трансформации. Однако, хочется знать точней.
1️⃣ В плане запроса в блоке Outline Data есть намек, на то, что таблица была исключена из JOIN - ELIMINATE_JOIN(@"SEL$1" "D"@"SEL$1")
2️⃣ Если хочется копнуть глубже. Можно выполнить трассировку оптимизатора и посмотреть через какие этапы прошел запрос при построении плана. В результате будет файл с данными на сервере СУБД.
Сформировать такой файл можно разными способами. Приведу только один (запрос должен выполняться впервые):
alter session set events '10053 trace name context forever';
alter session set tracefile_identifier='PLAN_TRC_EXAMPLE1';
select t.first_name
from hr.employees t
join hr.departments d on d.department_id = t.department_id
where t.first_name like 'Alex%';
alter session set events '10053 trace name context off';
В результате выполнения в каталоге на сервере будет создан trc-файл с меткой PLAN_TRC_EXAMPLE1.
Заглянув в секцию с преобразованиями, можно заметить интересную картину (см. скриншот выше ⬆️).
⚠️ для запросов, которые уже выполнялись используйте - dbms_sqldiag.dump_trace.
На курсе по оптимизации будем разбирать подобные вопросы 🎓
Обсудить в чатике
#решениезадачи #оптимизация
Oracle Developer