簡體   English   中英

在where子句中使用嵌套查詢時的MSSQL性能問題

[英]MSSQL performance issue when using nested query in where clause

MSSQL正在做我不了解的事情,希望在這里找到答案。

我有一個小查詢,該查詢在where子句中使用2個子查詢:

where TerminatedDateTime between @startdate and @enddate
and Workgroup in (select distinct Workgroup from #grouping)
and Skills in (select Skills from #grouping) 

該查詢運行正常,但是當我查看執行計划時,將看到以下內容: http : //i.stack.imgur.com/ogkRP.png

查詢從#grouping選擇不同的工作組有一個結果:“ workgroup1”

查詢的結果有541行,但仍會獲取日期選擇中的所有行。 如果刪除工作組和技能部分,則行數相同。 過濾是在哈希匹配中完成的。 如果輸入選擇查詢所在的名稱,則會看到以下內容:

where TerminatedDateTime between @startdate and @enddate
and Workgroup in ('workgroup1')
and Skills in (select Skills from #grouping) 

http://i.stack.imgur.com/Ydq6C.png

在這里,它選擇正確的行數,查詢運行得更好。 為什么會這樣,並且有一種方法可以通過子查詢運行查詢,並使其僅從視圖中選擇相關行? 我已經在#grouping表上使用內部聯接進行了嘗試,但結果相同,因此選擇了很多行。

我不確定您為什么需要在中distinct (select distinct Workgroup from #grouping)

這里的問題是估算不正確。 在沒有看到整個查詢和執行計划XML的情況下,我建議嘗試以下替代方法:

  1. 在#temp表中選擇workgroupskills並加入

  2. 在語句中添加option(recompile)

每個人本身都應該是一個解決方案。

無論如何,查看執行計划XML將是有益的。

編輯(在查看執行計划后,將其公布):

該查詢是基於分區視圖的。 有了檢查約束,我們可以根據@startdate和@enddate參數的運行時值正確完成分區消除。

為什么優化器針對第一個查詢(一個使用子查詢)和第二個查詢(一個帶標量)生成不同的執行計划?

就優化器而言,子查詢僅生成一行只是一個巧合。 它必須創建一個執行計划,該計划將對子查詢的任何輸出有效,無論該行是一行還是多行。

OTOH,當您指定標量值時,優化器可以自由地做出更直接的決策。

使用分區視圖使優化器的工作更加困難,因此我最初的建議顯示沒有用。

是的,優化器可能在這里可以做得更好。 順便說一句,工作組和技能是否有任何關聯?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM