SQL - быстрый поиск интервалов - PullRequest
3 голосов
/ 16 июля 2011

У меня есть таблица GeoIP с тремя столбцами: bigint Start, bigint End и varchar Country (на самом деле это отображение IP на страну).Интервалы задаются столбцами Start и End, сортируются и не имеют перекрытий или пропусков.В этой таблице много строк (сотни тысяч).

Таблица Пользователи с тремя столбцами: int UserId, varchar Login и IP-адрес bigint.

Какой самый быстрый способ sql (оператор и архитектура таблицы)) объединить эти таблицы, чтобы назначить страну каждому пользователю?Мне бы хотелось, чтобы View.

В данный момент я использую перекрестное применение, но оно работает довольно медленно.

ОБНОВЛЕНИЕ:

Я был не правв первоначальном вопросе.К счастью, поиск интервалов работает плавно.Настоящая проблема заключалась в конкатенации строк типа GeoIP.Country + ' ' + GeoIP.Region + ' ' + GeoIP.City AS Region.Они плохо изменили план исполнения.Переключение моих расчетов с SELECT на пользовательскую функцию решило проблему.

1 Ответ

2 голосов
/ 17 июля 2011

Однажды у меня была похожая проблема с таблицей диапазонов 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 на пользовательскую функцию может решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...