好吧这听起来像是其他人应该已经解决的问题,但我无法找到任何帮助,只是他们应该比使用不平等的连接更好的方式。
我有一个带有源IP的会话信息的日志文件,我正在尝试创建一个实际运行的查询,将日志文件与Geo-IP数据结合起来告诉DB用户连接的位置。我的第一次尝试来了: -
SELECT coco, region, city
FROM GT_Geo_IP
WHERE (IP_Start <= [IntIP] AND IP_End >=[IntIP])
ORDER BY IP_Start;
它似乎运行得非常快,并返回给定IP的正确记录。但是当我尝试将它与日志数据结合起来时,如下所示: -
SELECT T.IP,G.coco,G.region, g.city
FROM GT_Geo_IP as G, Log_Table as T
WHERE G.IP_Start <= T.IntIP AND G.IP_End >= T.IntIP
ORDER BY T.IP;
它锁定访问超过45分钟(盯住我的一个cpu内核)之前我最终决定我需要一些CPU回来或我应该真正去做其他事情。从狩猎周围来看,这实际上比我意识到的慢,我找到了this文章,并将IP_Start和IP_End编入索引以优化搜索,并在此基础上提出了这个: -
SELECT TOP 1 coco, region, city
FROM GT_Geo_IP
WHERE G.IP_Start >= [IntIP]
ORDER BY G.IP_Start;
但是凭借我的SQL技能,我无法弄清楚如何将它与我的日志数据结合起来。
基本上问题是如何使用更好的方法和我的日志数据来获得所需的结果?或者有更好的方法吗?
GeoIP数据来自IP2Location&lt; LITE-DB3
我已经考虑了嵌套查询,但我无法解决如何构建它,我想过使用VBA,但我不确定它会更快
答案 0 :(得分:1)
@EnviableOne
请尝试此SQL语句。
SELECT
L.IP,
(
SELECT TOP 1
CONCAT(coco, ', ', region, ', ', city)
FROM
GT_Geo_IP
WHERE
IP_Start >= L.intIP ORDER BY IP_Start
) AS Location
FROM
Log_Table AS L;