2012-07-24 52 views
2

我在我的數據庫中有一個巨大的表,其中包含城市之間的距離。這使我的應用程序能夠在選擇起始城市時查找世界各地的附近城市。針對大型SQL Server表執行不同的兩個類似查詢

它包含4列:

ID, StartCityID, EndCityID, Distance 

,幷包含大約120萬行。

我有索引建立在startcityIDendcityID,另一個用於兩個,每個另一個用於startcity + distance,並且endcity + distance(這是我使用索引的第一個真正的交易所以不是100%肯定,如果我做它正確)。

反正 - 我做了以下2個查詢:

Select distinct StartCityID 
From Distances where EndCityID = 23485 

Select distinct EndCityID 
From Distances where StartCityID = 20045 

他們都返回相同數量的cityID的,但前一個需要35秒鐘做,和最下面的一個立即返回結果。當我查看索引時,他們似乎被設置爲以相同的方式服務startCityendCity

任何人都知道他們爲什麼會採取不同的行爲?我不知所措......

NB - 這可能會提供更深入的瞭解,但需要35秒一個 - 如果我按執行同樣具有相同的ID直線距離,它返回結果立即以及那個時候。

不幸的是,這不是我的網站,但它可能是有用的信息。

感謝

+1

你是否看了**執行計劃** SQL Server將告訴你(在管理工作室)兩個查詢和比較那些? – 2012-07-24 09:36:20

+1

您是否在每次測試之間執行了DBCC FREEPROCCACHE? – podiluska 2012-07-24 09:37:15

+0

嗨馬克 - 謝謝 - 我不知道執行計劃,那太棒了。它顯示了Gulli Meel在下面描述的 - 我有一個StartHub/EndHub索引,但不是相反。非常感謝。 – 2012-07-24 09:46:39

回答

1

第二個是覆蓋指數,因此快的,因爲你有startcity和endcity指數。

endcity上的索引沒有覆蓋(因爲它沒有startcity),因此無論是它必須加入其他索引來獲取數據或必須進行密鑰查找,因此需要時間。此外,它必須做hash不同的或不同的使用SOR,而第一個犯規需要做的,以及數據在endcity排序爲給定的startcity.Also爲什麼要使用不同的會你有startcity重複數據和endcity.If沒有DUP數據刪除不同。

檢查然後計劃這些第一個應該是索引搜索endcity + distnace索引,然後最有可能的關鍵查找它可以clustred索引掃描以及基於endcity的選擇性。然後散列不同或排序不同。

其次應該對指數startcity + endcity只是索引查找。

你剛纔提到,第二次就立即返回,這是因爲數據已經在緩存中。因此,嘗試以下

DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE ,然後第一次運行第二查詢..

注意:PROD服務器和其他cirtical servers.Try這在一臺機器上不要使用這些地方,它不會影響其他用戶。

+0

嗨Gulli,是的,就是這樣。索引增加了另一種方式,它像夢一樣工作。非常感謝 – 2012-07-24 09:47:39

0

您只需要考慮一下......

您的表是否有主鍵?它是什麼?這意味着什麼(擁有主鍵)? DISTINCT關鍵字要求什麼?

0

嘗試此查詢(避免DISTINCT關鍵字)

Select StartCityID From Distances group by StartCityID where EndCityID = 23485 

Select EndCityID From Distances group by EndCityID where StartCityID = 20045 
+0

只是奇怪什麼diff截然不同和分組作用.. – 2012-07-24 09:47:11

+0

Group by適用於where子句和DISTINCT將在where子句之後應用。因此group by更好。 – AnandPhadke 2012-07-24 09:56:43

+0

Group by適用於where子句之後,而不適用於where子句之前。如果它在where子句之前應用,則意味着它將應用於整個數據集,然後數據將在稍後過濾,因此它應該比較慢,因爲它會執行更多工作。 – 2012-07-24 09:59:42