SQL-最快间隔查找

SQL-最快间隔查找,sql,performance,join,Sql,Performance,Join,我有三列的GeoIP表:bigint Start、bigint End和varchar Country实际上,这是IP到国家的映射。间隔由开始列和结束列指定,排序后没有重叠或间隙。这张桌子有很多行,数十万行 表用户有三列:int UserId、varchar Login和bigint IP 连接这些表以向每个用户分配国家/地区的最快sql方式语句和表体系结构是什么?我想看看风景 目前,我使用交叉应用,但它的工作相当缓慢 更新: 最初的问题我错了。幸运的是,间隔查找工作顺利。真正的问题是像GeoI

我有三列的GeoIP表:bigint Start、bigint End和varchar Country实际上,这是IP到国家的映射。间隔由开始列和结束列指定,排序后没有重叠或间隙。这张桌子有很多行,数十万行

表用户有三列:int UserId、varchar Login和bigint IP

连接这些表以向每个用户分配国家/地区的最快sql方式语句和表体系结构是什么?我想看看风景

目前,我使用交叉应用,但它的工作相当缓慢

更新:


最初的问题我错了。幸运的是,间隔查找工作顺利。真正的问题是像GeoIP.Country+''+GeoIP.Region+''+GeoIP.City这样的字符串连接。他们严重改变了执行计划。将我的计算从选择功能切换到用户功能解决了这个问题。

几年前,在Oracle 10g上查询包含给定元素的范围时,我曾经遇到过一个IP范围表的类似问题:

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这样的字符串连接。他们可能会严重改变执行计划。将计算从选择切换到用户函数可能会解决问题。

您的瓶颈是UDF GeoIP。我假设它是一个具有表访问权限的标量UDF,因此您强制对表进行RBAR类型的访问。@Denis请将您的更新/答案作为实际答案发布,如果它修复了问题,请接受它problem@hamlin11“我无法做到这一点,因为我在这里的代表性很低。@丹尼斯,我把它移到了@Ray's answer。”