我有一个存储ipFrom,ipTo,Country,isp等的表。表名是ipLocation。我想找到客户端ip的isp和country。 ipLocation表有大约1000万行。因此性能很重要您认为什么是最佳或优化的解决方案?我想用存储过程解决这个问题。
表格样本数据
ipFrom(bigint) ipTo(bigint) Code(varchar) Country(varchar) ISP(varchar)
16781312 16785407 "JP" "JAPAN" "BEACON NC INC."
16785408 16793599 "CN" "CHINA" "CHINANET GUANGDONG PROVINCE NETWORK"
16793600 16809983 "JP" "JAPAN" "ENERGIA COMMUNICATIONS INC."
用户客户端IP: 16784408
我尝试了顺序搜索,但这很慢。
注意:ipFrom,ipTo是bigint,客户端ip是长类型
答案 0 :(得分:2)
您需要的是一个简单的范围查询,如
SELECT ipFrom,ipTo,Country,ISP
FROM ipLocation l
WHERE @UserClientIP BETWEEn l.ipFrom AND l.ipTo
WHERE @UserClientIP
可以是您的过程的参数。如果运行缓慢,请检查查询执行计划。首先猜测是一个缺失的索引。试试这个声明:
SELECT i.object_id,i.name index_name,i.type_desc,t.name table_name,c.name column_name
FROM sys.indexes i
JOIN sys.index_columns ic ON ic.object_id=i.object_id
JOIN sys.columns c ON c.object_id=ic.object_id AND c.column_id=ic.column_id
JOIN sys.tables t ON t.object_id=i.object_id
WHERE t.name='ipLocation'
应该返回类似
的内容object_id index_name type_desc table_name column_name
-----------------------------------------------------------------------------------
3278483 IX_your_index_name NONCLUSTERED ipLocation ipFrom
9856985 IX_your_index_name_2 NONCLUSTERED ipLocation ipTo
如果您没有找到此类行,则应在ipFrom
和ipTo
列上创建索引。
<强>更新强> 我刚看到你用oracle和sql-server标记了你的问题。索引检查的语句适用于SQL Server。