在一系列数字上进行选择时,选择速度较慢



我有一个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]

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

我发现它正在进行索引扫描,而不是索引查找。将select语句从"内部联接"更改为"内部循环联接"非常适合此调用。

我在startIPNum和EndIPNum列上都有索引,但正是索引扫描扼杀了性能。我对聚集索引和非聚集索引进行了比较,并没有发现任何实际的性能差异。

最新更新