Рассмотрим этот оператор SQL:
select *
from chamado.servico se
join chamado.chamado ch on ch.id_servico=se.id_servico
join chamado.statuschamado sc on sc.id_statuschamado=ch.id_statuschamado
where sc.id_statuschamado=1
;
Теперь рассмотрим соответствующий план выполнения:
Теперь обратите особое внимание на красную коробку! Предикат фильтра (CH.ID_STATUSCHAMADO=1
). Его нет в запросе, и это самая дорогая операция.
Таблица SERVICO
содержит менее 200 строк, таблица STATUSCHAMADO
содержит менее 10 строк, но таблица CHAMADO
содержит более 70000 строк.
Мое намерение с теми объединениями, где нужно выполнять полное сканирование таблиц только на STATUSCHAMADO и SERVICO, что должно было налагать накладные расходы на Oracle.
Что не так в моем утверждении?
Обновление 1
У меня есть следующие индексы:
- CHAMADO.ID_CHAMADO (PK)
- CHAMADO.ID_SERVICO
- CHAMADO.ID_AREAATENDIMENTO
- SERVICO.ID_SERVICO (PK)
- AREAATENDIMENTO.ID_AREAATENDIMENTO (PK)