Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)
Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>
我不知道第二條語句是否可以給一個更小的結果集。如果B中有幾行與A中的一行匹配,那麼我們是否可以通過第二條語句獲得所有這些匹配?
Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)
Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>
我不知道第二條語句是否可以給一個更小的結果集。如果B中有幾行與A中的一行匹配,那麼我們是否可以通過第二條語句獲得所有這些匹配?
作爲最終結果,是的。 關於執行:查詢優化器最終可能會爲兩個查詢創建相同的查詢執行計劃。
如果根據其近似的統計數據(例如近似等深度的直方圖 - 並不是所有時間都是最新的),則優化器將確定第一次連接比第二個更具有選擇性,因此,它會首先執行這個。
Stmt1允許您指定連接的順序,並且考慮到您確切知道表中包含的內容,這可能是更好的解決方案。
謝謝。我想查詢優化器會將第二個變爲連接(因爲關係代數中沒有其他可能性來連接關係) – user1000742 2012-07-11 17:17:55
第二個已經包含三個內部連接。第二個有更大的複雜性。 – Razvan 2012-07-11 17:21:15
要告訴的唯一方法是執行一個SHOW PLAN。根據統計數據,在很多情況下,這兩個查詢可能會產生相同的計劃,因此可能會以相同的方式執行。例如,如果優化器根據索引的選擇性和表中的行數決定第二個查詢,即首先連接到b優於將b連接到c,則這兩個查詢將在同樣的方式。 – 2012-07-11 17:39:45
語義上查詢將是相同的。然而,試圖依靠計劃證明這不是一個好主意。
也可以放入任意的<cond1>
和<cond2>
,以便查詢在第二種形式中有效,但在第一種形式中不合法。
從這個意義上說,第二個是更一般的,但只要第一個是好的,那麼第二個就是等價的。
您是否嘗試運行它們以查看結果是否相同? – Taryn 2012-07-11 17:09:12
是的,我做了,並與我的例子,它工作。但無論如何,我覺得這很刺激。也許還沒有相同的。 – user1000742 2012-07-11 17:13:03
@StefanH謝謝 - 從未實現過接受按鈕。 – user1000742 2012-07-11 17:18:39