Столкнулся со следующей проблемой: есть 2 больших таблицы (больше миллиона строк каждая) в первой таблице (zakaz) условно номера заказов и контрагенты , во второй (tovar) - сведения о товарах . В обеих таблицах есть индексированное поле "номер заказа", так что они без проблем связываются в запросах через left join. Есть необходимость вытащить из этих таблиц записи, в которых название контрагента и описание товара
частично совпадают со сведениями, содержащимися в третьей таблице (ono) (около 100 строк). Oracle стоит v10xxx, встроенная функция utm_match_jaro_winkler работать отказалась, так что пришлось написать свою функцию, которая сравнивает 2 текстовых значения и выдаёт процент соответствия от 0 до 100 (zerkalo).
Худо-бедно написал для всего этого нижеприведённый запрос, который, с учётом объёма данных, работает УЖАСНО медленно. Подскажите, пожалуйста, как бы это заставить работать быстрее?
Select
zakaz.ID,
zakaz.firma, ono.firma, zerkalo(zakaz.firma, ono.firma),
tovar.name, ono.name, zerkalo(tovar.name, ono.name)
from zakaz left join tovar on zakaz.ID = tovar.ID, ono
where
zerkalo(zakaz.firma, ono.firma)>85,
zerkalo(tovar.name, ono.name)>85,
zakaz.date > '01.10.2015',
zakaz.city = 'Москва'
Ну где-то так. Реально условий чуть больше и полей тоже, но имхо они тут роли не сыграют. Есть подозрение, что я дурак и сервер обработает этот запрос условно следующим образом:
1. Свяжет таблицы zakaz (1 млн записей) и tovar (10+ млн) итого 10 млн записей;
2. Для каждой записи подставит значения из таблицы ono - 10 млн*100 = млрд. записей причём с расчётом функции zerkalo для каждой;
3. Из этого безобразия начнёт выбирать записи, удовлетворяющие указанным условиям.
4. Начнёт меееедленно выдавать результаты.
Хотелось бы заставить это всё работать быстрее и уменьшить нагрузку на сервер. Хотя бы отсечь сразу дату и город, сократив запрос в сотни раз.
Немного о структуре таблиц: Поля city и date есть и в таблице zakaz и в таблице tovar. Поле ID уникально в таблице zakaz, но повторяется в таблице tovar. Каждому ID, соответствует только одна date и city.
Прав на создание вьюшек нет (мало ли, вдруг помогут), большую таблицу на сервере создать не могу.