我有一个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]
答案 0 :(得分:1)
我非常建议在startIpNum和endIpNum上添加一个索引。
答案 1 :(得分:0)
我发现它正在进行索引扫描而不是索引搜索。将select语句从“内部联接”更改为“内部循环联接”对此调用很有效。
我在startIPNum和EndIPNum列上有索引,但是索引扫描正在扼杀性能。我使用了聚簇索引和非聚簇索引,并没有看到任何性能差异。