Для повышения производительности одним из ключевых аспектов является удаление невыбранных строк как можно скорее. Наличие двух отдельных объединений - хороший выбор, поскольку вы заставляете объединения сразу исключать несовпадающие строки.
Но сначала вам нужно убедиться, что движок использует предикат самого быстрого доступа для фильтрации данных из массивных таблиц source_A
и source_C
. Для ваших предикатов фильтрации вы используете простые равенства ... это идеально. Я бы добавил следующие индексы в ваши таблицы (если у вас их еще нет):
create index ix1 on source_A (field1, field2);
create index ix2 on source_C (field1, field2);
Теперь, после выбора строк из source_A
и source_C
вам потребуется доступ к source_B
. Чтобы эта задача была быстрой, вам необходимо убедиться, что следующий индекс также присутствует:
create index ix3 on source_B (common_field);
Вы также упоминаете, что можно использовать некоторые столбцы из source_B
. Чтобы сделать это незначительно быстрее, вы можете попробовать на нем индекс покрытия. Например, если вы используете столбец name
из source_B
, я бы преобразовал этот индекс в индекс покрытия, как в:
create index ix3 on source_B (common_field, name); -- added column "name"
Наконец, после внесения этих изменений вы должны получить план выполнения, чтобы увидеть, что делает оптимизатор SQL. Это никогда не повредит, и покажет вам подробно, если он выбирает лучший путь или нет. Используйте EXPLAIN
, чтобы получить его.