2013-10-23 53 views
1

我有在下面表的性能\SQL性能:在連接或直接連接中選擇?

表A的一個問題 - 有隻有5個客戶的ID(5行1列) 表B - 是主基地,爲所有客戶和他們的信息。 (1個百萬行和500列的)

查詢1: -

Select A.*, 
     B.Age 
from A 
left join B 
on A.Customer_id = B.Customer_id; 

問題2: -

Select a.*, 
     B.Age 
from A 
left join 
(select Customer_id,age from B) C 
on A.Customer_id = C.Customer_id; 

馬在這裏的性能問題是因爲在表B中存在500列。 我覺得第二個查詢更好,因爲SQL不會在包含表B的所有列的連接期間創建臨時表。

請讓我知道這是錯誤的嗎?

+0

使用所需列上的索引使查詢運行更快 –

+0

執行計劃會告訴您哪一個更好。 –

+0

我如何查看執行計劃? –

回答

0
CREATE INDEX index_name ON table_b (customer_id) 

然後用

Select a.*, 
     B.Age 
from A 
left join (select Customer_id, 
        age 
      from B) C 
     on A.Customer_id = C.Customer_id; 
+0

爲什麼從B中選擇內聯視圖? –

+0

這是通過刪除連接操作並將多個單獨查詢集中到單個查詢中來簡化複雜查詢? –

+0

我沒有看到過剛剛加盟到「B」一個好處,在這種情況下,雖然 –

0

500列是相當廣泛的。

也許你可以創建像一個指標:

CREATE INDEX index_name 
      ON table_b (customer_id, 
         age 
        ); 
1

我覺得第二個查詢是SQL更好不會有在加入含有從表B中的所有列創建臨時表

您可以判斷Oracle是否在執行過程中創建臨時表,還是從解釋計劃中創建臨時表。你還應該考慮一下,如果Oracle內核開發者存在,是否會遇到這樣一個明顯的性能問題。

碰巧,不會有臨時表,並且您的第一個查詢沒有任何問題。由於性能原因,幾乎從不需要操作查詢 - 編寫查詢是您所需邏輯的最佳封裝。在選擇

+0

你能告訴哪個查詢速度更快,爲什麼(選擇上面顯示的2之間的一個)? –

+0

它們可能執行完全相同,因爲查詢優化器將通過稱爲視圖合併的機制將第二個查詢轉換爲第一個查詢。 –

+0

你可以給我一些鏈接,瞭解查詢優化器和視圖合併? –

0

子查詢比使用加入更快(無論直接連接或子選擇)

select 
    a.*, 
    (select b.age 
    from b 
    where b.customer_id = a.customer_id) 
from a 

注:

  • 它像外連接(在返回空場年齡,如果來自b的customer_id不存在於a)
  • 子查詢應該只從a的每行b中返回一行。
+0

我想看到一些證據斷言「select中的子查詢比使用join更快」。過去它通常意味着排除某些連接方法,並可能導致性能問題。恐怕我不相信這是真的。 –