Sql-Server
查詢執行計劃分析
我最近開始了我作為 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" />
所以這個查詢可能應該被改進以消除這些問題,你不應該期望修復會帶來巨大的好處。