SQL - 最快的间隔查找

时间:2011-07-16 19:52:55

标签: sql performance join

我有三列的表GeoIP:bigint Start,bigint End和varchar Country(实际上,这是IP到国家/地区的映射)。间隔由“开始”和“结束”列指定,已排序且没有重叠或间隙。这个表有很多行(十万)。

表具有三列的用户:int UserId,varchar Login和bigint IP。

连接这些表以便为每个用户分配国家/地区的最快sql方式(语句和表架构)是什么?我想要查看。

目前我使用交叉申请,但效果很慢。

更新:

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

1 个答案:

答案 0 :(得分:2)

我有一个类似的问题曾经有一个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切换到用户函数可以解决问题。