从IPAddress中查找数百万条记录的位置

时间:2016-08-03 14:54:58

标签: sql-server sql-server-2016

我有一张表,其中有250万个IP地址,大多数在美国。我想使用这些数据来查找他们的时区。到目前为止,我已经从Maxmind下载了GeoLite城市表并将它们导入我的服务器。

http://dev.maxmind.com/geoip/legacy/geolite/

Maxmind(Blocks)中的第一个表具有起始IP整数列,结束IP整数列和对应于该范围内的整数的LocID。该表从整数1600万开始,达到约15亿。第二个表具有与第一个表中的LocID相对应的地理信息。

在CTE中,我使用下面的代码将表格中的IP地址转换为整数格式。代码似乎输出正确的值。我还包括主键ID列和常规IP地址.CTE称为CTEIPInteger。

(TRY_CONVERT(bigint, PARSENAME(IpAddress,1)) +
         TRY_CONVERT(bigint, PARSENAME(IpAddress,2)) * 256 +
         TRY_CONVERT(bigint, PARSENAME(IpAddress,3)) * 65536 +
         TRY_CONVERT(bigint, PARSENAME(IpAddress,4)) * 16777216 ) as IPInteger

然后我在起始和结束IP整数列上创建了一个非聚集索引。

我尝试使用如下连接。

select IPAddress,IPInteger,LocID
from CTEIPInteger join Blocks 
on IPInteger>= StartIpNum and IPInteger<=EndIpNum

前1000个记录的加载速度非常快,但在计算机永远运行后却没有输出任何内容。

对于Blocks表,我也在StartIPNum上尝试了索引,我也尝试了只有LocID的索引。

我应该如何获得时区?我使用正确的数据库吗?如果必须的话,我可能愿意为Geolocation服务付费。

0 个答案:

没有答案