`

关于ip区间查询sql的写法

阅读更多

我们在项目中遇到了这样的一个问题,要查询ip对应的地址,采用的是google的地图库,

其中我们把地图库导入了数据库,构造了一个这样的表

-- Create table
create table T_GGMAP_IP
(
  IPSTART NUMBER not null,
  IPEND   NUMBER not null,
  LOCID   NUMBER,
  COMPANY VARCHAR2(200)
)
tablespace SKYEYE
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table T_GGMAP_IP
  add constraint PK_GGMAP primary key (IPSTART, IPEND)
  using index 
  tablespace SKYEYE
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create unique index IPEND on T_GGMAP_IP (IPEND)
  tablespace SKYEYE
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
create unique index IPSTART on T_GGMAP_IP (IPSTART)
  tablespace SKYEYE
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

 IPSTART NUMBER ---是ip段开始的数字表示形式,即为a.b.c.d转化为 a*255*255*255+b*255*255+c*255*255+d*255
  IPEND   NUMBER not null, ip段的截止数字表示形式
  LOCID   NUMBER,   ip段对应地址的编号
  COMPANY VARCHAR2(200)

 

如果我们要查询某个ip属于那个地址无非是这样

select * from t_GGMAP_IP t where t.ipstart<=query_ip('202.117.0.20') and t.ipend>=query_ip('202.117.0.20') 

---query_ip是自定义的一个转化ip为数字的函数(a*255*255*255+b*255*255+c*255*255+d*255

 查询执行计划发现

SELECT STATEMENT, GOAL = ALL_ROWS   191 10171 233933
 TABLE ACCESS BY INDEX ROWID YGUO T_GGMAP_IP 191 10171 233933
  INDEX RANGE SCAN YGUO PK_GGMAP 184 330 

 

虽然用到了INDEX RANGE SCAN  PK_GGMAP 但实际执行速度非常慢。T_GGMAP_IP表中大概有400W数据

 所以改进型的sql不应该使用PK_GGMAP的RANGE SCAN ,最好能直接使用INDEX UNIQUE SCAN

 

所以sql可以改造

select t2.* from (select max(t.ipstart) ipst from t_GGMAP_IP t where t.ipstart<=query_ip('202.117.0.20')) t1,t_GGMAP_IP t2 where  t1.ipst=t2.ipstart and t2.ipend>=query_ip('202.117.0.20')

 为

 执行计划为

SELECT STATEMENT, GOAL = ALL_ROWS   5 1 36
 NESTED LOOPS   5 1 36
  VIEW YGUO  3 1 13
   SORT AGGREGATE    1 7
    FIRST ROW   3 203411 1423877
     INDEX RANGE SCAN (MIN/MAX) YGUO IPSTART 3 203411 1423877
  TABLE ACCESS BY INDEX ROWID YGUO T_GGMAP_IP 2 1 23
   INDEX UNIQUE SCAN YGUO IPSTART 1 1 

 

 实际执行起来速度非常好

 

 

分享到:
评论
1 楼 kingtiy 2013-05-28  

相关推荐

    绝对惊世骇俗的SQL写法

    "绝对惊世骇俗的SQL写法"这一标题揭示了我们即将探讨的是一些非同寻常的MySQL查询技巧,这些技巧可能挑战了常规的编程思维,能为程序员带来全新的理解和操作体验。描述中的“耗费了本人大量心血”暗示了作者在深入...

    高级SQL写法

    高级SQL写法

    PB脚本中SQL语句写法与SQL中语句写法对照

    PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...

    DB2常用SQL写法

    SQL(Structured Query Language)是用于操作数据库的语言,包括查询、插入、更新和删除数据等操作。在DB2中,SQL的使用是核心功能之一,对于初学者来说,掌握常见的SQL写法至关重要。 首先,我们可以看到创建和...

    ip纯真数据库sql文件

    SQL(结构化查询语言)是用于管理关系数据库的标准语言,这表明这个文件可能包含了插入、更新或删除IP数据的SQL语句,或者是一个可以直接导入到数据库管理系统(如MySQL、PostgreSQL等)以创建或更新IP数据库的脚本...

    sql学习 集合写法.sql

    sql学习 集合写法.sql

    最新IP地址对应省市SQL

    标题 "最新IP地址对应省市SQL" 提供了一个关键信息,即这个压缩包包含的是与IP地址地理定位相关的SQL数据。这种数据通常用于帮助系统识别访问者的地理位置,以便提供定制的内容或执行其他地理位置相关的操作。 描述...

    IP数据库,SQL文件

    导入这个文件到一个MySQL数据库中,用户可以运行SQL查询来获取和处理IP地址相关的各种信息。例如,你可以查找特定IP地址所在的地理位置,或者分析一段时期内来自特定地区的网络活动。 IP数据库的使用场景多种多样,...

    mysql只取年月日的SQL写法.sql

    mysql只取年月日的SQL写法

    sql查询oracle时间段操作

    在"查询oracle时间段操作.txt"文件中,可能包含了具体的SQL查询示例、快照创建步骤和闪回功能的使用指南,以及关于如何有效利用这些工具进行数据恢复和分析的详细说明。阅读这份文件将进一步加深你对Oracle时间段...

    IP纯真sql 数据库脚本与ip转化为十进制数字函数便于高效查询

    IP纯真sql 数据库脚本与ip转化为十进制数字函数便于高效查询 数据库IP数据需要下载。 ALTER FUNCTION [dbo].[X16ToDe] ( @Old_IP nvarchar(15) ) RETURNS numeric AS BEGIN DECLARE @CharIndex INT, @CurrPoint ...

    关于在SQL中抛出异常的写法

    在SQL编程中,正确地抛出异常是调试和错误处理的关键环节。这使得开发者能够捕获并处理程序运行中的问题,特别是在复杂的存储过程和触发器中。本篇将详细讲解如何在SQL中抛出异常,以及它在报表开发中的应用。 SQL...

    SQL语句实现跨Sql server数据库操作实例

    这里假设我们需要从IP地址为192.168.1.1的SQL Server实例(数据库名为TT)中查询表test1的所有记录。 **SQL语句示例**: ```sql SELECT * FROM OPENQUERY( [远程服务器别名], 'SELECT * FROM TT.dbo.test1' ) ``...

    ip 地域 数据库 sql 脚本

    总之,`IP.sql`文件是一个将纯真IP数据库转换为可直接在SQL数据库中使用的脚本,它简化了数据导入过程,并使开发者能够方便地查询和利用IP与地域信息。通过正确地执行和利用这个脚本,你可以搭建一个强大的IP地域...

    解析IP地址连接SQL数据库速度慢的原因

    本文分析了使用IP地址连接SQL Server数据库的速度慢的原因,介绍了获取最新的Microsoft SQL Server 2000 Service Pack、最新的Microsoft Data Access Components 2.6 Service Pack来解决此问题。

    SQL销售明细大佬写法.sql

    SQL销售明细大佬写法.sqlSQL销售明细大佬写法.sql SQL销售明细大佬写法.sqlSQL销售明细大佬写法.sql SQL销售明细大佬写法.sql

    纯真ip数据库 ip ip数据库sql2005版 ip

    在实际应用中,你可能会编写SQL查询或利用存储过程来查询特定IP地址的信息。例如,以下是一个简单的查询示例: ```sql SELECT * FROM IPTable WHERE IP = '192.168.1.1'; ``` 这会返回与IP地址'192.168.1.1'相关联...

    IP地址库SQL版(最新)

    IP地址库SQL版(最新)

    ip归属地sql文件

    ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧....ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧...ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, ...

    Sql Server2012 使用IP地址登录服务器的配置图文教程

    就是在本地或者远程连接别人的数据库的时候,以ip地址作为服务器名称 以SQL Server 身份验证(即输入登录名和密码)的方式登录数据库 总会出现错误 比如说会提示一下错误: 用户 ‘sa’ 登录失败,该用户与可信 SQL ...

Global site tag (gtag.js) - Google Analytics