SQL - 最快的间隔查找

标签 sql performance join

我有一个包含三列的 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/

相关文章:

sql - 将 Oracle SQL Developer 自动完成建议设置为小写

SQL 提示在执行前将整个表加载到 RAM 中?

Jquery .map().join (", ") 文本未加入逗号 (,)

mysql - 加入具有相同 ID PDO 的 2 个表

mysql - 不在第二个表中的记录列表的内部联接(非内部联接)

mysql - 优化 mysql 查询以查找所有重复条目

java - 当发生约束违反异常时

javascript - JavaScript 中的性能内存管理

java - 如何用Java检测互联网连接速度?

Java:如何制定有效的机会方法