我有一张表,其中有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服务付费。