2012-03-12 48 views
0

我有一個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

你的執行計劃是什麼樣的? – 2012-03-12 15:26:23

+1

你的桌子上是否有任何索引? – Lamak 2012-03-12 15:29:52

+0

您給我們定義了一個表格,但您似乎是從視圖中進行選擇。視圖定義是什麼樣的?這個視圖中的所有選擇都很慢,還是僅僅是這個? – 2012-03-12 15:30:27

回答

1

我非常建議增加對startIpNum和endIpNum的索引。

0

我發現它正在做索引掃描而不是索引查找。將select語句從「內部連接」更改爲「內部循環連接」對於此調用非常有效。

我在startIPNum和EndIPNum列上有索引,但這是索引掃描造成的性能損失。我玩過聚簇和非聚簇索引,並沒有看到真正的性能差異。