2012-12-11 179 views
1

我很難找出什麼是最好的,或者如果有差異, 但是我還沒有找到任何材料來幫助我理解這個,所以我會問這個問題,如果不是我的話,那麼對於其他可能以相同情況結束的人來說。SQL - 加入後加入聚合查詢或聚合/總和?

聚合子查詢之前或之後加入,在我的具體情況,子查詢是相當緩慢的,由於分散的數據和壞的正常化過程,

我有一個主查詢,是非常複雜的和從3個小查詢構建的子查詢(使用聯合組合)(將刪除重複記錄) 我只需要來自此子查詢的單個值(對於每行),因此在某些時候,我將最終求和這個數值(連同分組必要的控制數據,所以我可以加入)

什麼wi會產生最大的影響?

  • 綜上所述子查詢之前的連接,然後用聚集的版本加入
  • 爲了保持數據原,然後與主查詢的其餘部分一起求和值

請記住,每條線都會有數千條記錄彙總在一起,並且數據不是原生的,而是構建的,因此可能駐留在內存中, (這只是來自查詢優化器角度的猜測)

+0

我發現這兩種方法太慢,所以我不能測試,看看什麼是最好的,感謝您的答案,我現在試圖從不同的方法 – bonitzenator

回答

2

通常我將group-by保留在子查詢中(在Oracle語言中稱爲「內聯視圖」)。 這樣查詢就更加簡單明瞭了。 另外我相信執行計劃更有效率,因爲要聚合的數據集較小,並且得到的一組連接鍵也較小。

雖然這不是一個確定的答案。如果要加入內聯視圖的行源具有少量匹配行,則可能會發現早期加入會減少聚合工作量。

正確的方法是:對特定數據集的查詢進行基準測試。

1

我認爲在這樣一個普遍的方式中,沒有正確或錯誤的方法來做到這一點。從像你描述的一個查詢的性能取決於許多不同的因素:

  • 什麼樣的加入是你真正做(什麼算法在後臺使用)
  • 是要連接的數據足夠小以適應加入它的機器的內存?
  • 何種查詢優化是你使用,即什麼DBMS(甲骨文,MSSQL,MySQL和...)
  • ...

對於你的情況,我只是建議標杆。我很抱歉,如果這看起來不是一個滿意的答案,但它是在很多性能問題中走的路...

因此,使用您的方法和一些測試數據設置一個簡單的測試,然後選擇任何是比較快的。

+0

這個答案也是正確的,但我傾向於同意colemar on聚合簡化部分, – bonitzenator