Ваша таблица содержит более 70000 строк.Вы выбираете все его записи дважды и сравниваете строки на основе неравенства.Таким образом, в основном вы сравниваете каждую строку с каждой другой строкой в таблице.(Не все из них, потому что не те, где TARIFF_ID, TYPE_ID или DIGITS не совпадают, но их не так много). Это ~ 490 000 000 сравнений.Десять минут выполнения не кажутся слишком плохими в данных обстоятельствах.
План объяснения показывает, что Oracle выбрал лучший план, который он может.Все, что вы можете сделать, чтобы улучшить это, это дать Oracle более полезный индекс.Составной индекс, который использует все столбцы в предложении where, может помочь.Примерно так:
create index super_match_idx on tt_matchcodes_view
(tariff_id, .type_id, digits, matchcode, expirydate, effectivedate )
Это может дать вам два ПОЛНЫХ БЫСТРОГО СКАНИРОВАНИЯ в индексе, что должно быть быстрее, чем две операции ПОЛНОГО СКАНИРОВАНИЯ.
Кстати, вы сортируете данные, когдаВы заполняете временную таблицу?Использование ORDER BY, который совпадает с индексом, улучшит коэффициент кластеризации.Таким образом, вы можете получить более быстрый поиск, поскольку все совпадающие строки с большей вероятностью будут находиться в смежных блоках.
Обычно я не советую сортировать строки в таблицах кучи, но, поскольку вы уже платите за вставку во временную таблицу, вы можете получить столько же сока взамен.
Ох, и substr(p.matchcode, 0, length(p1.matchcode))
- это мертвая распродажа.Умные клавиши - это отстой!В любом случае, есть ли когда-нибудь случай, когда этот вызов SUBSTR () возвращает значение, которое не соответствует DIGITS?(Опять же, ваши примеры данных неоднозначны.) Если DIGITS достоверно идентифицирует выходные данные SUBTSR (), я предлагаю вам отказаться от этой последней строки.