2009-07-10 52 views
1

我目前在MSSQL的查詢,看起來像工作:在SQL聚合兩個選擇一組由實在是太慢了

SELECT 
    ... 
FROM 
(SELECT 
    ... 
)T1 
JOIN 
(SELECT 
    ... 
)T2 
GROUP BY 
... 

內選擇相對較快,但外部選擇骨料內選擇並花費很長時間來執行,經常超時。通過刪除組使其運行速度更快,並將連接更改爲LEFT OUTER JOIN以加快速度。

爲什麼要在選擇聚合兩個內部選擇會導致查詢運行如此緩慢的選擇?爲什麼INNER JOIN運行速度比LEFT OUTER JOIN慢?我能做些什麼來進一步解決這個問題?

編輯:什麼讓這更令人困惑的是兩個內部查詢是日期有限和整體查詢只有在七月開始和七月任何其他日期之間查看日期範圍時運行緩慢,但如果日期範圍是在7月1日和今天之前的任何時候,它都能正常運行。

+0

發佈更多詳情 – 2009-07-10 11:37:28

回答

0

的問題是零散的數據。數據進行碎片整理後,查詢在合理的時間限制內開始運行。

1

沒有您的查詢的一些更多細節,它不可能提供任何提示您可以加快查詢的提示。一個可能的猜測是兩個內部查詢阻止訪問任何可能用於執行連接的索引,從而導致大掃描,但可能存在許多其他可能的原因。

若要檢查的時間被用在查詢查詢執行計劃,有

http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx

基本跑下來查詢運行在這裏詳細解釋,並顯示執行計劃,然後尋找任何大的百分比 - 它們是減慢查詢速度的原因。

0

嘗試重寫沒有嵌套SELECT的查詢,這很少是必要的。當使用嵌套SELECT時 - 除了不重要的情況 - 內部SELECT結果集沒有索引,這使得它們加入任何緩慢的東西。

由於Tetraneutron說,發佈您的查詢的詳細信息 - 我們可能會幫助您以直通方式重寫它。

0

JOIN =笛卡爾乘積。來自兩個表格的所有列都將以衆多排列組合在一起。這很慢,因爲內部查詢正在查詢每個單獨的表,但是一旦它們碰到連接,它就成爲笛卡爾產品,並且更難以管理。這將發生在外部選擇語句。

看看建議的Tetraneutron INNER JOINs。

0

你給了連接謂詞嗎?即加入表A ON table.ColA = table.ColB。如果你沒有給出謂詞,那麼SQL可能會被迫使用嵌套循環,所以如果你在該範圍內有很多行,它會解釋查詢速度減慢。

看看SQL Studio中的計劃,如果你有MS Sql Server的話。

0

您T2語句後添加一個連接條件上t1.joinfield = t2.joinfield