我有一個表,包含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地址範圍內高效搜索」一樣...... –