2014-09-22 71 views
0

我見過類似的文章,但沒有確定的答案。SQL SERVER - 使用BETWEEN運算符有效地連接兩個表

我使用GEOLITE上(免費數據庫)來搜索的IP塊,以地理IP,想做到這一點的本體 -

相應的IP的已經被轉換成ipblocks,坐在一張桌子(L )。

每個ipblock都在一個範圍內(在startIpNum和endIpNum之間),它位於另一個表(g)中。

下面作品查詢,但是,是極其低效尤其是因爲我需要在大的時間週期執行這一 -

SELECT l.ipAddress, g.locId 
FROM l 
INNER JOIN g ON l.ipblock BETWEEN g.startIpNum AND g.endIpNum 

這兩個表進行索引(g是化合物索引),

甲由於連接是在BETWEEN運算符上進行的,因此無法執行HASH連接。

是唯一可行的選項重組表g?或者有另一種方式?

+0

什麼是「複合索引」是什麼意思?在哪些列上? 'b.locId'從哪裏來? – 2014-09-22 20:42:12

+0

另外你爲什麼會認爲散列連接在這裏會有用? – 2014-09-22 20:51:42

+0

感謝您的回覆。翻譯從我的母語:)我的意思是一個複合索引,而不是一個複合索引。這是在startIpNum和endIpNum – aborg88 2014-09-22 20:58:11

回答

0

的最佳索引單個查詢是具有在其節點WHERE/JOIN子句中的所有列的一個,並且SELECT子句中所有列均在葉(如果不是在節點已經) 。

嘗試把這個指數表l,看看性能是否改善:

CREATE INDEX IDX_l_ipblock ON l (ipblock) INCLUDE (ipAddress) 
+0

感謝您的回答,但不幸的是它仍然非常緩慢。我還想補充說,ipblock是一個BIGINT,大約7-8位數 - 我不是100%確定這是否會影響性能。 – aborg88 2014-09-22 22:12:26

+0

你可以數量「慢」,即:它現在需要多少秒,以及你的目標是「足夠好」? 「l」和「g」表有多大? – 2014-09-22 22:27:41

+0

l表是180萬,g表是2,000,000。 – aborg88 2014-09-23 07:48:49