2012-05-15 56 views
0

我有一個相當複雜的SQL查詢,涉及多個子查詢和聯合。儘管複雜,但子查詢部分執行起來非常快(編譯後的1ms內爲<)。但是,當我將查詢作爲一個整體運行時,它需要60ms以上的時間。直接評估SQL Server中的子查詢

我已經使用「設置統計時間」和「設置統計數據」來跟蹤基表的訪問,並且SQL執行的邏輯讀操作比所需要的多得多。當我自己運行子查詢時,它只有10個左右的讀取,但是當整個查詢運行時大約是1800。

我想鼓勵SQL首先評估子查詢 - 預期的行數是1-5,因此數據集很小。然後它應該被內部加入到同一個基表中,並將估計的10-20條記錄撤回。

有沒有辦法使用提示來確保SQL優化的預期情況?查詢邏輯似乎對於優化器來說太多了,它選擇的執行計劃對於行集來說只是理想狀態,遠遠大於在我的情況下會存在的行集。

編輯:最終連接中的一個條件將過濾出基表中99.99%的行。如果我可以強制SQL首先對它進行評估,那麼它應該做到這一點。有沒有辦法做到這一點?

查詢文本在這裏:http://pastebin.com/zVR91AP2

隨着WHERE末條款註釋掉,查詢將返回4行,運行在< 1毫秒與33的邏輯讀取審計表。 但是,如果我取消註釋WHERE子句,它會返回3行(1個被過濾掉),並且需要50ms的時間,並對審計表進行高達1277個邏輯讀取。 io統計數據表明,工作表正在首次使用,但不在第二次。我想鼓勵SQL使用這個工作表。

+2

是您的統計數據是最新的嗎? –

+2

沒有代碼就不能幫你... –

+1

你可能想把你的解釋計劃添加到問題中。 – pms1969

回答

0

解決了它。解決方案是使用聯接提示,這會在將內部查詢連接到較大的表之前強制對內部查詢進行評估。

inner REMOTE join dbo.poAudit ... etc