我们在项目中遇到了这样的一个问题,要查询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查询技巧,这些技巧可能挑战了常规的编程思维,能为程序员带来全新的理解和操作体验。描述中的“耗费了本人大量心血”暗示了作者在深入...
高级SQL写法
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
SQL(Structured Query Language)是用于操作数据库的语言,包括查询、插入、更新和删除数据等操作。在DB2中,SQL的使用是核心功能之一,对于初学者来说,掌握常见的SQL写法至关重要。 首先,我们可以看到创建和...
SQL(结构化查询语言)是用于管理关系数据库的标准语言,这表明这个文件可能包含了插入、更新或删除IP数据的SQL语句,或者是一个可以直接导入到数据库管理系统(如MySQL、PostgreSQL等)以创建或更新IP数据库的脚本...
sql学习 集合写法.sql
标题 "最新IP地址对应省市SQL" 提供了一个关键信息,即这个压缩包包含的是与IP地址地理定位相关的SQL数据。这种数据通常用于帮助系统识别访问者的地理位置,以便提供定制的内容或执行其他地理位置相关的操作。 描述...
导入这个文件到一个MySQL数据库中,用户可以运行SQL查询来获取和处理IP地址相关的各种信息。例如,你可以查找特定IP地址所在的地理位置,或者分析一段时期内来自特定地区的网络活动。 IP数据库的使用场景多种多样,...
mysql只取年月日的SQL写法
在"查询oracle时间段操作.txt"文件中,可能包含了具体的SQL查询示例、快照创建步骤和闪回功能的使用指南,以及关于如何有效利用这些工具进行数据恢复和分析的详细说明。阅读这份文件将进一步加深你对Oracle时间段...
IP纯真sql 数据库脚本与ip转化为十进制数字函数便于高效查询 数据库IP数据需要下载。 ALTER FUNCTION [dbo].[X16ToDe] ( @Old_IP nvarchar(15) ) RETURNS numeric AS BEGIN DECLARE @CharIndex INT, @CurrPoint ...
在SQL编程中,正确地抛出异常是调试和错误处理的关键环节。这使得开发者能够捕获并处理程序运行中的问题,特别是在复杂的存储过程和触发器中。本篇将详细讲解如何在SQL中抛出异常,以及它在报表开发中的应用。 SQL...
这里假设我们需要从IP地址为192.168.1.1的SQL Server实例(数据库名为TT)中查询表test1的所有记录。 **SQL语句示例**: ```sql SELECT * FROM OPENQUERY( [远程服务器别名], 'SELECT * FROM TT.dbo.test1' ) ``...
总之,`IP.sql`文件是一个将纯真IP数据库转换为可直接在SQL数据库中使用的脚本,它简化了数据导入过程,并使开发者能够方便地查询和利用IP与地域信息。通过正确地执行和利用这个脚本,你可以搭建一个强大的IP地域...
本文分析了使用IP地址连接SQL Server数据库的速度慢的原因,介绍了获取最新的Microsoft SQL Server 2000 Service Pack、最新的Microsoft Data Access Components 2.6 Service Pack来解决此问题。
SQL销售明细大佬写法.sqlSQL销售明细大佬写法.sql SQL销售明细大佬写法.sqlSQL销售明细大佬写法.sql SQL销售明细大佬写法.sql
在实际应用中,你可能会编写SQL查询或利用存储过程来查询特定IP地址的信息。例如,以下是一个简单的查询示例: ```sql SELECT * FROM IPTable WHERE IP = '192.168.1.1'; ``` 这会返回与IP地址'192.168.1.1'相关联...
IP地址库SQL版(最新)
ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧....ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, 支持大部分数据库吧...ip归属地sql文件, utf8格式,mysql到处, 内部是sql语句, ...
就是在本地或者远程连接别人的数据库的时候,以ip地址作为服务器名称 以SQL Server 身份验证(即输入登录名和密码)的方式登录数据库 总会出现错误 比如说会提示一下错误: 用户 ‘sa’ 登录失败,该用户与可信 SQL ...