2012-03-06 85 views
1

我想知道哪種更好的做法和/或更快。在下面,customer_id是主鍵。通過主鍵和其他5個字段進行分組,或者通過主鍵進行分組,然後通過加入來獲取其他字段。或者這是一個「取決於」的問題?SQL性能 - 由許多領域分組

select customer_id, customer_name, customer_address, 5 other description fields.., 
    sum(amount) as SalesAmount 
from customer c 
inner join orders o 
on o.customer_id = c.customer_id 
group by customer_id, customer_name, customer_address, 5 other description fields.. 

VS

select customer_id, customer_name, customer_address, 5 other description fields.., 
    SalesAmount 
from 
(
    select customer_id, 
    sum(amount) as SalesAmount 
    from customer c 
    inner join orders o 
    on o.customer_id = c.customer_id 
    group by customer_id 
) t 
inner join customer c 
    on c.customer_id = t.customer_id 
+0

執行計劃顯示什麼? – Lamak 2012-03-06 20:42:34

回答

2

這是一個依賴問題。後一種變體會再做一次連接,這可能會變慢。但是,如果從此連接獲得的附加數據很大,則速度會更快,因爲分組操作無需混洗所有數據。

所以你看,有兩種變種比其他變種更快。你需要測量。

我的猜測是,對於真實的數據和查詢,第一個變體通常要快得多。

0

我覺得拇指一般規則是爲了避免子查詢時可能的,如果沒有別的文體上(和改善的機會,查詢優化器會明白你在說什麼關於)。
但是,SQL性能問題只有一個正確的答案:自己嘗試一下數據。

0

我認爲第一個代碼更容易閱讀,這往往是選擇如何做事情的一個很好的起點。

你在猜測它自己:這是一個「它取決於」的問題,無法從理論上回答。你必須自己調查一下你的實際數據。

  1. 是性能問題嗎?
  2. 您是否運行了代碼並檢查了查詢執行計劃中的瓶頸?
  3. 您是否添加了建議的索引?
0

數據庫查詢性能總是取決於它。

使用探查器或測試替代品與一個現實的數據集。

+0

沒用...... – usr 2012-03-06 20:48:56