2013-03-12 62 views
1

如果我要在兩個表之間做一個連接,對於我作爲一個整體加入它們的事實是否會有任何區別,或者我之後加入了它們只提取了所需的列(假定每個表可能有許多列)?JOIN整個表與較少列JOIN表(通過子查詢獲取)

作爲一個例子,是

SELECT tableA.foreignKey, tableB.someValue 
FROM tableA JOIN tableB ON tableA.foreignKey=tableB.key 

任何不同於

SELECT tableA.foreignKey, tableB.someValue 
FROM (SELECT foreignKey FROM tableA) tableA_filtered 
JOIN (SELECT key, someValue FROM tableB) tableB_filtered 
ON tableA_filtered.foreignKey=tableB_filtered.key 

服務表現明智?

+2

查詢優化器告訴你什麼? – 2013-03-12 12:30:59

+0

@PeterLang我編輯的問題中的查詢是一個更正式的,因此更有意義。 – 2013-03-12 12:42:37

回答

1

使用第一個,因爲第二個使用子查詢,該子查詢爲結果創建臨時表。實際上(SELECT valueA FROM tableA)是毫無意義的,因爲你並沒有在表格上聚集一些列。

子查詢有時是邪惡的,並非在所有時間。 Tt取決於您正在使用的RDBMS。

+2

MS SQL通常優化子查詢,然後沒有性能損失(雖然第一個查詢看起來更好,易於維護等)。確定的查詢計劃需要進行比較以獲得特定情況的正確答案。 – Arvo 2013-03-12 12:37:27

+0

@阿爾沃我完全同意,但我不確定什麼是OP使用..他 – 2013-03-12 12:38:14

+0

我使用的是甲骨文,但我認爲這可能是一個相當普遍的問題任何方式,因爲也許大多數供應商遵循相同的基準下 - 但這只是一個假設 – 2013-03-12 12:41:32

0

我認爲在表格有很多列的情況下,第二個查詢可能會更快。但需要注意的是,這兩個查詢並不等同。第一個顯示A和B的所有值,第二個僅顯示A的值A和B的值B!無論如何,它更多是一個理論上的問題,並且很難回答。

實際上,我會把這個決定留給數據庫優化器。但是如果你想真正知道是否有辦法讓速度更快,唯一安全的方法就是測量和比較兩個查詢的運行時間。

而作爲一個旁註,第二個查詢將很可能被你的DBMS的重寫引擎扁平的,因此它的同時,你可以這樣寫:

SELECT值a,VALUEB FROM A,B WHERE A. valueA = B.valueB;

+0

我編輯了查詢,以使它們返回相同的結果(但這不是問題的要點) – 2013-03-12 12:48:13

+0

在這種情況下,它應該完全相同。對於第一個查詢,優化器將壓低您的選擇語句。對於第二種情況,重寫引擎首先會將查詢變平,然後優化器也會這樣做! – Chris 2013-03-12 12:50:17

0

一般規則是子查詢總是很慢。 根據您正在處理的數據量,它可能會產生很大的影響。

Reciently我刪除了一個大型選擇與大量的聯接子查詢。 SQL處理大約100,000行,如果不是更多。 刪除非常簡單的子選擇改進的性能50秒。 總的來說,sql需要兩分鐘的時間。所以它產生了很大的影響。