2012-03-12 67 views
0

我有一个GeoIP位置数据库,其IP地址表的起始和结束列是适用于相应位置记录的IP地址范围(即城市,州等)。块表有大约540万行数据。当我搜索特定的IP地址(下面的例子)时,搜索查询非常慢。有没有更好的方法来重新设计select语句或表来提高性能?选择一系列数字时选择速度较慢

SELECT [locationID] FROM [GeoLocationView] where (GeoLocationView.startipNum <= ip) and  (GeoLocationView.endipnum) >= ip) 

表如下所示

CREATE TABLE [dbo].[GeoCity_Blocks](
    [id] [int] IDENTITY(1,1) NOT NULL, 
[startIpNum] [bigint] NOT NULL, 
[endIpNum] [bigint] NOT NULL, 
[locId] [int] NOT NULL, 
CONSTRAINT [PK_GeoCity_Blocks_A] PRIMARY KEY CLUSTERED 
(
[startIpNum] ASC, 
[endIpNum] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+2

你的执行计划是什么样的? – 2012-03-12 15:26:23

+1

你的桌子上是否有任何索引? – Lamak 2012-03-12 15:29:52

+0

您给我们定义了一个表格,但您似乎是从视图中进行选择。视图定义是什么样的?这个视图中的所有选择都很慢,还是仅仅是这个? – 2012-03-12 15:30:27

回答

1

我非常建议增加对startIpNum和endIpNum的索引。

0

我发现它正在做索引扫描而不是索引查找。将select语句从“内部连接”更改为“内部循环连接”对于此调用非常有效。

我在startIPNum和EndIPNum列上有索引,但这是索引扫描造成的性能损失。我玩过聚簇和非聚簇索引,并没有看到真正的性能差异。