Во-первых, убедитесь, что у вас есть подходящие индексы для столбцов в предложении where (DIRx.id) и для объединяемой таблицы (base.personid) и что эти индексы анализируются, чтобы они представляли данные в таблице - если нетЕсли проанализировать, Oracle может выполнить полное табличное сканирование, когда вместо этого может использовать индекс.
SELECT INDEX_NAME,
NUM_ROWS,
LAST_ANALYZED
FROM DBA_INDEXES
WHERE TABLE_NAME IN ('T_DIRECTORY','T_PERSON');
Также вы заставляете его использовать индекс с помощью подсказки, но если одна таблица меньше другой, то хешОбъединение может быть лучшим решением, поэтому, возможно, попробуйте полностью удалить подсказку и посмотреть, поможет ли это.
Параллельный запрос
У вас есть несколько процессоров и больше ничего не работает, когда этоSQL выполняется, т. Е. Является ли он частью пакетного процесса или частью онлайн-процесса, который может быть вызван несколько раз одновременно.Если пакетный процесс и у вас несколько процессоров, попробуйте параллельный запрос, но не делайте этого, если это онлайн-программа (например, отчет, использующий параллельный запрос, попытается использовать все доступные процессоры, и производительность может ухудшиться, если он будет выполняться несколько раз одновременно).или если вы запускаете больше параллельных потоков, чем 2 на одно ядро ЦП.
На практике параллельные потоки будут примерно вдвое меньше времени выполнения на 4 потока.
Кластерные таблицы / индексы
Если эти таблицы всегда объединяются таким образом, вы можете рассмотреть кластеризованную таблицу (где oracle будет хранить соединительные строки каждой таблицы в одних и тех же блоках, поэтому не нужно тратить так много времени на поиск объединенной части, но это можетесть недостаток, если вы также часто обращаетесь к одной из таблиц по отдельности.
Context
Рассмотрение запроса в отдельности не всегда дает лучший ответ - делать что-то действительно быстроекогда это может быть не так, не помогает, поэтому посмотрите на контекст, то есть чтоБудете ли вы делать с 35000 возвращенными строками, они добавлены только сегодня, есть ли таблица с подмножеством, которое можно использовать вместо этого?