SQL -- 使用聯結還是子查詢?

iSQlServer發表於2009-10-19

關於子查詢,由來已久的傳統觀念認為,如果可以的話,使用聯結會更好些。在某些情況下,該觀點完全爭取,但有時候在不同場合,根據不同考慮,使用時會有一定傾向性。下表討論了決定效能權衡的某些問題,以及傾向於哪一種解決方案:

情況

傾向於

從子查詢中返回的數值對於外部查詢中的所有行是相同的

預查詢。宣告變數,然後選擇需要的值放入變數中,這能使即將形成的子查詢只執行一次,而不是對外部表中的每一條記錄執行一次。事實上SQL Server中的優化器相當聰明,它一旦察覺到處於這樣的情形,將為你進行預查詢,但是別依賴它。為了以防萬一,當你意識到這樣的情形時,請執行你自己的預查詢。

兩個表都相對較小(例如:只有10 000條記錄或者更少)

      子查詢。不清楚確切的原因是什麼,但是,經過實驗可知,當所有的查詢資料僅僅屬於一、兩個資料頁時,查詢比起聯結花費的開銷更少。

在考慮了所有的條件後,匹配將只返回一個值

    子查詢。同樣,比起必須聯結整張表來說,只找尋一條記錄並代換它所需的開銷要少得多。

在考慮了所有的條件後,匹配將只返回相對較少的值,並且,在查詢列上沒有索引

子查詢。通常,比起雜湊聯結來說,單獨的一次或者甚至數次查詢將花費較少的開銷。

查詢表相對較小,基表很大

若可以的話,則使用巢狀子查詢;若聯結相對於相關子查詢,則使用聯結。使用子查詢時,查詢只發生一次,因而其開銷相對較小。然而,如果使用的是相關子查詢,則查詢將會迴圈許多次-----既如此,大多數情況此案聯結將是更好的選擇。

相關子查詢與聯結

聯結。本質上,相關子查詢將造成巢狀迴圈的情形。這會產生相當多的開銷。多數情況下,他遠遠快於遊標,但是,它比其他可能的選擇方案要慢一些

派生表與其他選擇

   派生表常常意味著大量的開銷,因此需要謹慎使用。要知道,派生表只執行一次,隨後就會駐留於記憶體中,因而,多數的開銷存在於首次建立的過程中以及沒有索引的較大結果集上。它們可能很快、也可能很慢,這取決於具體的情況。在進行編寫派生表前要仔細考慮。

EXISTS與其他選擇

EXISTS。不必針對同樣的條件進行多次查詢------但找到了特定行的一個匹配,將進入到下一個查詢中,這能夠極大地減少開銷。

  以上只是比較顯著的情況而以,必定存在著形形色色不同的混合以及無窮無盡另外的情況。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章