У меня есть таблица IP-диапазонов и их соответствующих городов и стран, которым принадлежит этот IP-диапазон. IP-адреса представлены как bigint
(см. Приведенное ниже уравнение для превращения IP-адреса в bigint
), и я делаю выбор, чтобы узнать, какие города / страны используют веб-сайт.
Уравнение для преобразования IP в число:
Bigint = (octet1 * (2^24)) + (octet2 * (2^16)) + (octet3 * (2^8)) + Octet 4
Мой выбор выглядит следующим образом. В любом случае, когда у меня есть много IP-адресов (200) для поиска, предложение where может быть очень длинным, а результаты возвращаются в течение нескольких минут. У меня есть startipnum
и endipnum
, проиндексированные как кластерный индекс. Таблица содержит 6,25 млн строк данных (диапазоны IP-адресов и страны в ней). Есть ли лучший способ вернуть данные?
SELECT [startIpNum] ,[endIpNum],[country],[region],[city],[postal_code]
,[latitude],[longitude],[metroCode],[areacode]
FROM [GeoLocationView]
WHERE
(30072067 between startipNum and endipnum)
OR
(30072069 between startipNum and endipnum)
или
SELECT [startIpNum] ,[endIpNum],[country],[region],[city],[postal_code]
,[latitude],[longitude],[metroCode],[areacode]
FROM [GeoLocationView]
WHERE
(startipNum <= 30072067 and 30072067 <= endipnum) or
(startipNum <= 30072069 and 30072069 <= endipnum)