這裏是一個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正確的,較小的表應該複述第一和更大的表插入
現在,如果你猜大小錯誤首先,由於中期處理角色逆轉,您會受到表現處罰。這可能是緩慢的原因嗎?
我試圖明確inner merge join
和inner 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);
我需要在其上建立一個獨立的統計呢?
這不是一個哈希連接,它是一個哈希匹配。這是UNION運算符的重複刪除(注意,它只有一個輸入) – 2010-12-10 11:54:44