【问题标题】:SQL - fastest interval lookupSQL - 最快的间隔查找
【发布时间】:2011-10-06 21:13:53
【问题描述】:

我有包含三列的 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 切换到用户函数解决了这个问题。

【问题讨论】:

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

标签: sql performance join


【解决方案1】:

我曾经遇到过类似的问题,其中一个 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 切换到用户函数可能会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多