Однажды у меня была похожая проблема с таблицей диапазонов IP, которая постоянно выполняла полное сканирование при запросе диапазона, содержащего данный элемент (в Oracle 10g несколько лет назад):
select country
from geoip
where ? between start and end
Решение былопереписать запрос примерно так:
select country
from geoip
where start = (
select max(start)
from geoip
where start <= ?
)
and end >= ?
Возможно, эта техника ускорит ваш запрос?Я не на 100%, это та же проблема, так как вы хотите присоединиться, но, возможно, вы можете использовать теорию.
Альтернативное решение
Реальная проблемаможет быть в конкатенациях строк, таких как GeoIP.Country + '' + GeoIP.Region + '' + GeoIP.City AS Region.Они могут плохо изменить план выполнения.Переключение расчетов с SELECT на пользовательскую функцию может решить проблему.