什么是最快的范围搜索方式

时间:2014-06-11 13:43:22

标签: sql sql-server performance oracle

我有一个存储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是长类型

1 个答案:

答案 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

如果您没有找到此类行,则应在ipFromipTo列上创建索引。

<强>更新 我刚看到你用oracle和sql-server标记了你的问题。索引检查的语句适用于SQL Server。