Sql-Server

使用探測殘差辨識執行計劃

  • August 15, 2019

我正在嘗試找出具有Probe Residual.

需要了解以下內容

  1. 哪個物理和邏輯運算符有這個Probe Residual
  2. 查詢中該運算符 的**Cost%**是多少
  3. 相關執行計劃
  4. 查詢文本

以下是我嘗試過的——但我無法獲得其他細節。如何獲取這些詳細資訊?

注意:我使用的是 SQL Server 2012

WITH XMLNAMESPACES
(
   DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan'
)
SELECT
   DECP.cacheobjtype,
   DECP.objtype,
   DECP.plan_handle,
   DEQP.objectid,
   DEQP.query_plan,
   DEST.[text]
FROM sys.dm_exec_cached_plans AS DECP
CROSS APPLY sys.dm_exec_query_plan(DECP.plan_handle) AS DEQP
CROSS APPLY sys.dm_exec_sql_text(DECP.plan_handle) AS DEST
WHERE
   1 = DEQP.query_plan.exist(
       '//RelOp[
           @PhysicalOp = "Hash Match"
           ]')

探針殘差範例

在此處輸入圖像描述

以下來自 Grant Fritchey 和 Rob Farley 的部落格/文章的參考資料

  1. 雜湊匹配上的探測殘差 - 可怕的 DBA 的家
  2. 當你有雜湊匹配時探測殘差——執行計劃中的隱藏成本

您要做的是在交叉應用中使用nodes() 方法(xml 數據類型)RelOp應用於節點上的 shred,這樣您就可以使用value() 方法(xml 數據類型)來獲取您正在尋找的屬性值。

您正在專門尋找RelOp具有節點的Hash/ProbeResidual節點,因此您應該在nodes()函式的 XQuery 參數中的謂詞中使用它。

WITH xmlnamespaces(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT DEQP.query_plan,
      DEST.text,
      RO.X.value('@PhysicalOp', 'nvarchar(50)') as PhysicalOp,
      RO.X.value('@LogicalOp', 'nvarchar(50)') as LogicalOp,
      RO.X.value('@EstimatedTotalSubtreeCost', 'float') as EstimatedTotalSubtreeCost
FROM sys.dm_exec_cached_plans AS DECP
 CROSS APPLY sys.dm_exec_query_plan(DECP.plan_handle) AS DEQP
 CROSS APPLY sys.dm_exec_sql_text(DECP.plan_handle) as DEST
 CROSS APPLY DEQP.query_plan.nodes('//RelOp[Hash/ProbeResidual]') as RO(X);

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