Sql-Server

查詢執行計劃分析

  • September 6, 2022

我最近開始了我作為 dba 的旅程,我發現了 Brent Ozar 的那些有趣的腳本來檢查我的數據庫的健康狀況。我執行了一些腳本,我發現有一些巨大的問題正在發生。sp_BlitzCache 的結果:有問題的查詢

計劃警告引起了我的注意,因此我決定分析所選查詢的執行計劃。

預計執行計劃

實際執行計劃

由於我是初學者,我無法完全理解該查詢發生了什麼。各位大俠能給點見解嗎?

以下是有關該計劃的警告

  <Warnings>
     <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(30),[MW].[hora_leit],23)" />
     <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(30),[MW].[hora_leit],23)" />
     <MemoryGrantWarning GrantWarningKind="Excessive Grant" RequestedMemory="32496" GrantedMemory="32496" MaxUsedMemory="696" />
   </Warnings>

它有很多 nonSARGable 謂詞

DATEPART ( MINUTE , MX . HORA_LEIT ) = DATEPART ( MINUTE , D0 . HORA_LEIT ) 

除其他外,這會影響基數估計,從而導致過多的記憶體授予。

基本上,這個查詢的問題導致估計成本比實際成本高出大約 100 倍。在一天結束時,查詢執行得非常快:

<WaitStats>
 <Wait WaitType="LATCH_EX" WaitTimeMs="1" WaitCount="3" />
 <Wait WaitType="PAGEIOLATCH_SH" WaitTimeMs="1" WaitCount="2" />
 <Wait WaitType="SOS_SCHEDULER_YIELD" WaitTimeMs="2" WaitCount="75" />
 <Wait WaitType="SESSION_WAIT_STATS_CHILDREN" WaitTimeMs="8" WaitCount="5" />
 <Wait WaitType="CXPACKET" WaitTimeMs="403" WaitCount="20" />
</WaitStats>
<QueryTimeStats CpuTime="312" ElapsedTime="239" />

所以這個查詢可能應該被改進以消除這些問題,你不應該期望修復會帶來巨大的好處。

引用自:https://dba.stackexchange.com/questions/316495