2010-07-31 138 views
0

我使用SQL Server 2008中,和我有兩個表爲什麼兩個查詢之間的性能差異?

表1

包含350萬條記錄

+----+-------------+ 
| pk | dim1  | 
+----+-------------+ 
indexing applied on column **pk** 

表2

含有15萬條記錄

+----+-------------+ 
| fk | fact1  | 
+----+-------------+ 
indexing applied on column **fk** 

我跑這些表2個查詢來獲得t2.fact1

查詢1

SELECT t2.fact1 
FROM Table1 AS t1, Table2 AS t2 
WHERE t2.fk = t1.pk 

QUERY2

SELECT t2.fact1 
FROM Table1 
WHERE t2.fk IN (SELECT t1.pk FROM Table1 AS t1) 

那得到的是查詢1把7 secs而QUERY2了6 secs

結果

雖然我在一些博客中讀到的內容類似於如上所述在查詢中使用IN,但會降低查詢速度。

問題1:有人可以提出爲什麼Query2更快?

在同一張表上的另一個實驗中(當應用NO INDEXING時),我運行了上面的查詢,再次查詢2比Query1快,遺憾的是不記得它的時間。

問題2:有人可以提出爲什麼Query2更快?

回答

4

6 VS7秒可以很容易地測量誤差

  • 運行都看到實際的執行計劃
  • 運行幾次,比較計時
  • 第二屆查詢可以與數據緩存運行時,第一個不是。使用DBCC DROPCLEANBUFFERS

觀察:你應該使用這個構造

Select t2.fact1 from 
    Table1 as t1 JOIN table2 as t2 on t2.fk=t1.pk 

編輯:

  • DBCC DROPCLEANBUFFERS將清除數據緩存
  • 聯接語法是更好的,更清晰

當然,現在我意識到由於行數相乘,查詢1給出不同的結果會導致差異。也就是說,每個父行都有多個子行。 In不會這樣做。

我通常會繼續談論這件事,但之前忽略了它。

我現在想知道的是有多少行每個查詢返回...

+0

1)是一些什麼新的東西是無法解釋的執行計劃,可以請指導我。 2)跑了好幾次,但結果是類似的。 3)什麼是DBCC DROPCLEANBUFFERS,請指導,會喜歡去探索這些東西 4)JOIN如何影響 但一般情況下哪個查詢應該是FASTER? – 2010-07-31 12:10:22

+0

即將在一天或2將再次發佈新的統計數據,希望你會回覆。 – 2010-08-01 09:17:33

相關問題