`

关于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查询技巧,这些技巧可能挑战了常规的编程思维,能为程序员带来全新的理解和操作体验。描述中的“耗费了本人大量心血”暗示了作者在深入...

    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数据库的脚本...

    最新IP地址对应省市SQL

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

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

    mysql只取年月日的SQL写法

    纯真ip数据库转sqlserver

    在SQL Server 2000这样的关系型数据库管理系统中存储和查询IP数据可以极大地提高查询效率和准确性。将纯真IP数据库转换到SQL Server 2000涉及到以下几个关键步骤和知识点: 1. 数据库结构设计:首先,我们需要设计...

    IP地址库 SQL Server数据库文件

    标题中的“IP地址库 SQL Server数据库文件”表明这是一个包含了IP地址数据的SQL Server数据库。IP地址库通常用于存储大量的IP地址信息,可能包括IP地址、所属国家、地区、城市等详细地理位置信息,常用于网络监控、...

    关于在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' ) ``...

    实现 Oracle 连接 SQL Server

    4. **测试连接**:使用创建好的数据库链接查询 SQL Server 数据库中的表,例如: ``` SELECT * FROM jobs@pubs; ``` 如果连接成功,将返回 SQL Server 数据库中的数据。 #### 结论 通过以上步骤,可以成功...

    SQLServer版纯真IP转换查询工具

    做网站访问统计时需要记录用户的IP地址和所在地区,纯真IP的文件查询方式不太适合网站,所以就把它转换成了SQLSERVER数据库版,本工具可以非常方便的将IP数据导入到指定的SQL SERVER 数据库中,并拥有IP查询功能。...

    ip数据库脚本(ip.sql)

    标题中的“ip数据库脚本(ip.sql)”指的是一个用于存储IP地址信息的数据库脚本文件,其格式为SQL,这种文件通常包含了创建数据库表、插入数据等操作的SQL语句。在本例中,这个数据库是专门用来管理IP地址的,可能是...

    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 ...

    IP地址库20181029(SQL Server)

    《IP地址库20181029(SQL Server)》是一个专为SQL Server设计的IP地址数据库,它提供了一种高效的方式来管理和查询全球范围内的IP地址信息。该数据库基于两个知名的数据源——纯真数据库和淘宝地址库,经过整合和...

    sql学习 执行计划SQL写法差异改变之3_rownum分页.sql

    sql学习 执行计划SQL写法差异改变之3_rownum分页.sql

    sql mongo对应写法

    sql mongodb对应写法 方便大家查询

    SQL语句实现查询SQL Server服务器名称和IP地址

    在SQL Server中,有时我们需要获取服务器的名称和IP地址,这在系统管理和远程连接时尤其重要。本篇文章将详细介绍如何使用SQL语句来查询这些信息。 首先,我们来看如何获取SQL Server服务器的名称: 1. 使用`...

Global site tag (gtag.js) - Google Analytics