我有一个表,包含IP地址范围(作为整数值)和相应的国家,地区和城市分配到该范围。它看起来如下:如何有效搜索IP地址范围?
CREATE TABLE [dbo].[IpToRegion]
(
[BeginRange] [bigint] NOT NULL,
[EndRange] [bigint] NOT NULL,
[CountryCode] [varchar](10) NOT NULL,
[Country] [varchar](50) NOT NULL,
[Region] [varchar](100) NOT NULL,
[City] [varchar](100) NOT NULL
) ON [PRIMARY]
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-20151031-193911] ON [dbo].[IpToRegion]
(
[BeginRange] ASC,
[EndRange] ASC
)
GO
此表中有9.1M行。为了找到一个单一的IP地址的位置,我先将其转换为一个大的INT,然后执行以下查询:
DECLARE @IPNumber BIGINT
DECLARE @IPAddress varchar(20)
Set @IPNumber = (CONVERT(bigint, PARSENAME(@IPAddress,1)) + CONVERT(bigint, PARSENAME(@IPAddress,2)) * 256 + CONVERT(bigint, PARSENAME(@IPAddress,3)) * 65536 + CONVERT(bigint, PARSENAME(@IPAddress,4)) * 16777216)
Select City + ', ' + Region + ', ' + Country
From IpToRegion
Where @IPNumber Between BeginRange And EndRange
问题是这样的查询可以从5到20秒到执行。下面是查询计划:
当然,我的问题是如何将这些查询需要很长时间来执行?它正在聚集索引上查找并返回一行。我可以尝试一些不同的索引策略。但是,在这一点上,我更好奇为什么这个查询可以执行得如此糟糕。
这是一个很好的问题。我可以检查。这张表刚刚创建并且是静态的。我只是创建了表格并加载了数据。行以BeginRange顺序添加,但我会尝试重建索引。 –
我不知道为什么有人会低估,但试着将问题的标题改为更具描述性的内容。就像“如何在IP地址范围内高效搜索”一样...... –