我有包含三列的 GeoIP 表:bigint Start、bigint End 和 varchar Country(实际上,这是 IP 到国家/地区的映射)。间隔由开始和结束列指定,已排序且没有重叠或间隙。这个表有很多行(十万)。
包含三列的用户表:int UserId、varchar Login 和 bigint IP。
加入这些表以将国家分配给每个用户的最快 sql 方式(语句和表架构)是什么?我想要 View 。
目前我使用交叉应用,但它的工作速度很慢。
更新:
我在最初的问题中错了。幸运的是,间隔查找工作顺利。真正的问题在于像 GeoIP.Country + ' ' + GeoIP.Region + ' ' + GeoIP.City AS Region
这样的字符串连接。他们严重改变了执行计划。将我的计算从 SELECT 切换到用户函数解决了这个问题。
最佳答案
我曾经遇到过类似的问题,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 切换到用户函数可能会解决问题。
关于SQL - 最快的间隔查找,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6719848/