2010-12-10 40 views
2

這裏是一個CTE減慢整個存儲過程:SQL服務器:INNER JOIN UNION後導致慢哈希匹配(聚合)

select * 
from #finalResults 
where intervalEnd is not null 
union 
select    
    two.startTime, 
    two.endTime, 
    two.intervalEnd, 
    one.barcodeID, 
    one.id, 
    one.pairId, 
    one.bookingTypeID, 
    one.cardID, 
    one.factor, 
    two.openIntervals, 
    two.factorSumConcurrentJobs 
from #finalResults as one 
inner join #finalResults as two 
    on two.cardID = one.cardID 
    and two.startTime > one.startTime 
    and two.startTime < one.intervalEnd 

表#finalResults包含略超過600K線,上部分聯盟(where intervalEnd is not null)約580K行,下部加入#finalResults大約300K行。然而,這個內部聯接估計最終將達到100萬英里。行,這可能是負責長期運行的哈希匹配的位置:如果我understand Hash Joins正確的,較小的表應該複述第一和更大的表插入 alt text

現在,如果你猜大小錯誤首先,由於中期處理角色逆轉,您會受到表現處罰。這可能是緩慢的原因嗎?
我試圖明確inner merge joininner loop join希望改善行數估計,但無濟於事。
另一件事:右下角的Eager Spool估計17K行,結束300K行,執行將近50萬次重新綁定和重寫。這是正常的嗎?

編輯: 臨時表#finalResults上有一個指標:

create nonclustered index "finalResultsIDX_cardID_intervalEnd_startTime__REST" 
on #finalresults("cardID", "intervalEnd", "startTime") 
include(barcodeID, id, pairID, bookingTypeID, factor, 
     openIntervals, factorSumConcurrentJobs); 

我需要在其上建立一個獨立的統計呢?

+0

這不是一個哈希連接,它是一個哈希匹配。這是UNION運算符的重複刪除(注意,它只有一個輸入) – 2010-12-10 11:54:44

回答

1

我遇到過這樣的情況:UNION的查詢比UNION ALL慢得多,之後用DISTINCT。因此,雖然我沒有這個壞查詢計劃(?統計數據和指標都還好)的解釋,我建議你嘗試以下方法:

select distinct * from (
    select * 
    from #finalResults 
    where intervalEnd is not null 
    union all 
    select    
     two.startTime, 
     two.endTime, 
     two.intervalEnd, 
     one.barcodeID, 
     one.id, 
     one.pairId, 
     one.bookingTypeID, 
     one.cardID, 
     one.factor, 
     two.openIntervals, 
     two.factorSumConcurrentJobs 
    from #finalResults as one 
    inner join #finalResults as two 
     on two.cardID = one.cardID 
     and two.startTime > one.startTime 
     and two.startTime < one.intervalEnd 
) 
+0

我已經這樣做了:它提供了與使用'option(order group)'選擇原始CTE相同的執行計劃,即它需要相同的與以前一樣,它只是花費它排序而不是散列。 – 2010-12-10 11:44:47

+0

是的,看着這個查詢計劃,哈希匹配只有一個輸入 - 所以它是由UNION刪除重複造成的問題(並沒有任何暗示加入將有所幫助) – 2010-12-10 11:45:43

+0

我明白了。也許'UNION ALL'確保不使用'ÈXCEPT'添加重複記錄可能會有所幫助,因爲它會避免從第一部分排序580K行? – Lucero 2010-12-10 12:28:50

0

或許,如果你創建了CardId中列的統計信息將提高。