Почему предикаты доступа и фильтрации здесь одинаковы?

введите здесь описание изображения

Когда я получаю вывод автотрассировки запроса выше с помощью Oracle SQL Developer, я вижу, что условие соединения используется для предикатов доступа и фильтрации. Мой вопрос: считывает ли он все идентификаторы отделов из DEPT_ID_PK, а затем использует эти идентификаторы для доступа и фильтрации таблицы сотрудников? Если да, то почему таблица сотрудников имеет полное сканирование таблицы? Почему он снова считывает таблицу сотрудников, используя идентификаторы_отделов таблицы отделов? Может ли кто-нибудь прочитать этот план выполнения шаг за шагом и объяснить причину, по которой здесь используются предикаты доступа и фильтрации?

Наилучшие пожелания


person oramas    schedule 14.01.2021    source источник


Ответы (2)


это соединение слиянием (немного похожее на хеш-соединение, соединение слиянием используется, когда проекции соединяемых таблиц сортируются по столбцам соединения. Соединения слиянием быстрее и используют меньше памяти, чем хэш-соединения).

поэтому Oracle выполняет полное сканирование таблицы во внешней таблице (EMPLOYEES) и считывает внутреннюю таблицу упорядоченным образом.

предикаты фильтра - это столбец, на который будет выполняться проекция

дополнительные сведения: https://datacadamia.com/db/oracle/merge_join

person mshabou    schedule 14.01.2021

Он использует первичный ключ, чтобы избежать сортировки, иначе план был бы таким

Подсказанный план

Различие между предикатами доступа и предикатами фильтра не особенно последовательно, поэтому относитесь к ним со здоровой долей скептицизма. Например, если вы удалите подсказку USE_MERGE, то в плане больше не будет предикатов Fiter, а узел предикатов доступа будет перемещен под узел HASH_JOIN (где это имеет смысл и для MERGE_JOIN): enter

person Tegiri Nenashi    schedule 14.01.2021