选择一系列数字时选择很慢

时间:2012-03-12 15:24:50

标签: sql performance select

我有一个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 个答案:

答案 0 :(得分:1)

我非常建议在startIpNum和endIpNum上添加一个索引。

答案 1 :(得分:0)

我发现它正在进行索引扫描而不是索引搜索。将select语句从“内部联接”更改为“内部循环联接”对此调用很有效。

我在startIPNum和EndIPNum列上有索引,但是索引扫描正在扼杀性能。我使用了聚簇索引和非聚簇索引,并没有看到任何性能差异。