我们在项目中遇到了这样的一个问题,要查询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
实际执行起来速度非常好
分享到:
相关推荐
"绝对惊世骇俗的SQL写法"这一标题揭示了我们即将探讨的是一些非同寻常的MySQL查询技巧,这些技巧可能挑战了常规的编程思维,能为程序员带来全新的理解和操作体验。描述中的“耗费了本人大量心血”暗示了作者在深入...
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
SQL(Structured Query Language)是用于操作数据库的语言,包括查询、插入、更新和删除数据等操作。在DB2中,SQL的使用是核心功能之一,对于初学者来说,掌握常见的SQL写法至关重要。 首先,我们可以看到创建和...
SQL(结构化查询语言)是用于管理关系数据库的标准语言,这表明这个文件可能包含了插入、更新或删除IP数据的SQL语句,或者是一个可以直接导入到数据库管理系统(如MySQL、PostgreSQL等)以创建或更新IP数据库的脚本...
标题 "最新IP地址对应省市SQL" 提供了一个关键信息,即这个压缩包包含的是与IP地址地理定位相关的SQL数据。这种数据通常用于帮助系统识别访问者的地理位置,以便提供定制的内容或执行其他地理位置相关的操作。 描述...
mysql只取年月日的SQL写法
在SQL Server 2000这样的关系型数据库管理系统中存储和查询IP数据可以极大地提高查询效率和准确性。将纯真IP数据库转换到SQL Server 2000涉及到以下几个关键步骤和知识点: 1. 数据库结构设计:首先,我们需要设计...
标题中的“IP地址库 SQL Server数据库文件”表明这是一个包含了IP地址数据的SQL Server数据库。IP地址库通常用于存储大量的IP地址信息,可能包括IP地址、所属国家、地区、城市等详细地理位置信息,常用于网络监控、...
在SQL编程中,正确地抛出异常是调试和错误处理的关键环节。这使得开发者能够捕获并处理程序运行中的问题,特别是在复杂的存储过程和触发器中。本篇将详细讲解如何在SQL中抛出异常,以及它在报表开发中的应用。 SQL...
这里假设我们需要从IP地址为192.168.1.1的SQL Server实例(数据库名为TT)中查询表test1的所有记录。 **SQL语句示例**: ```sql SELECT * FROM OPENQUERY( [远程服务器别名], 'SELECT * FROM TT.dbo.test1' ) ``...
4. **测试连接**:使用创建好的数据库链接查询 SQL Server 数据库中的表,例如: ``` SELECT * FROM jobs@pubs; ``` 如果连接成功,将返回 SQL Server 数据库中的数据。 #### 结论 通过以上步骤,可以成功...
做网站访问统计时需要记录用户的IP地址和所在地区,纯真IP的文件查询方式不太适合网站,所以就把它转换成了SQLSERVER数据库版,本工具可以非常方便的将IP数据导入到指定的SQL SERVER 数据库中,并拥有IP查询功能。...
标题中的“ip数据库脚本(ip.sql)”指的是一个用于存储IP地址信息的数据库脚本文件,其格式为SQL,这种文件通常包含了创建数据库表、插入数据等操作的SQL语句。在本例中,这个数据库是专门用来管理IP地址的,可能是...
IP地址库SQL版(最新)
ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧....ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧...ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, ...
就是在本地或者远程连接别人的数据库的时候,以ip地址作为服务器名称 以SQL Server 身份验证(即输入登录名和密码)的方式登录数据库 总会出现错误 比如说会提示一下错误: 用户 ‘sa’ 登录失败,该用户与可信 SQL ...
《IP地址库20181029(SQL Server)》是一个专为SQL Server设计的IP地址数据库,它提供了一种高效的方式来管理和查询全球范围内的IP地址信息。该数据库基于两个知名的数据源——纯真数据库和淘宝地址库,经过整合和...
sql学习 执行计划SQL写法差异改变之3_rownum分页.sql
sql mongodb对应写法 方便大家查询
在SQL Server中,有时我们需要获取服务器的名称和IP地址,这在系统管理和远程连接时尤其重要。本篇文章将详细介绍如何使用SQL语句来查询这些信息。 首先,我们来看如何获取SQL Server服务器的名称: 1. 使用`...