2012-03-04 62 views
1

我遇到了幾個可以使用聯接或子查詢來編寫查詢的實例。我通常使用連接,但有時使用子查詢(沒有任何理由)。我已經在幾個地方(包括stackoverflow)讀過,在許多情況下連接速度都比子查詢要快,但有時子查詢速度會更快。現在我寫的查詢並不涉及大量的數據,所以我估計速度並不是什麼大問題。但對於未來,我對以下內容感到好奇。聯接/子查詢困境

a。)爲什麼連接速度比子查詢(通常)要快。

b。)子查詢更快時的實例是什麼。我怎麼會知道?

c。)如果我正在寫一個查詢,我應該如何判斷我應該使用子查詢還是聯接。如果有人用一個例子來解釋我,我會很感激。

回答

2

您的問題的答案。

a)連接速度不及子查詢(一般)。但是,如果您使用連接,DBMS通常會生成更加智能的執行計劃。這與查詢轉化爲執行計劃的兩個過程有關。

b)c)通常沒有寫快速查詢的規則。此外,只有一種方法可以爲您的任務選擇正確的查詢:您必須對不同版本進行基準測試。所以如果你必須決定如何制定一個特定的查詢基準,如果它表現良好,然後停下來。否則,改變一些東西並再次進行基準測試,如果沒有問題,請停止。使用接近生產環境的環境:使用現實的數據集。查詢可能在數千條記錄中表現良好,但與數百萬條記錄無關。使用與生產中相同的硬件。考慮在應用程序的上下文中對查詢進行基準測試,因爲其他查詢可能會影響其性能。

1

從研究我做的主要原因是,編譯器更直接地利用正確的索引,當你明確說明如何做加盟(即左連接,內連接等),如果你使用一個子查詢,你會讓它稍微優化一下,它並不總是以最快的方式(它被稱爲「優化器」而被推遲)。

不管怎麼說,這可能是更容易編寫你的子查詢,但如果你正在建設的速度和長期使用的查詢,其明確表示,你應該寫出來的明確連接。

這裏有一些觀點和例子一些鏈接:

Join vs. Subquery

Another link這的人給出了一些比子查詢的詳細信息,爲什麼連接速度更快(在大多數情況下)。

more examples

+0

您的鏈接特定於SQL-Server,MySQL和DB2。它們通常不涉及SQL和Join-vs-subqueries的性能。 – 2012-03-04 23:53:37

3

說,加入「基本上是」快比子查詢是不正確的。這完全取決於所使用的DBMS。

對於Microsoft SQL Server我知道這是不正確的。通常,表現相同。不僅在理論上,而且在實踐中。

對於MySQL我聽說子查詢有問題。我沒有個人證據。

Oracle似乎與SQL Server差不多。

+0

感謝您的回答。在我編寫查詢之前,最好的方法是判斷是使用連接還是應該使用子查詢。對於任何dbms。你如何判斷? – Ank 2012-03-05 00:16:34

+0

無法判斷任何dbms。請告訴我們一個具體的。 – usr 2012-03-05 00:17:27

+0

說MySQL。我的意思是你怎麼決定什麼時候做。或者它是否爲這個DBMS使用這個DBMS的連接使用子查詢等 – Ank 2012-03-05 00:34:50