デッドロック検出のためのSQL拡張イベントセッション


12

<inputbuf>デッドロック拡張イベントセッションによってキャプチャされたデッドロックXMLの要素のサイズを増やす方法はありますか?

アプリケーションコードで問題を特定するのに役立つ完全なクエリが必要です。

1024文字+/-に制限されているようです。増やすことはできますか?

サンプルXMLについては、以下を参照してください。<inputbuf>要素のクエリテキストが選択リストの中央で途切れていることがわかります。

<deadlock>
 <victim-list>
  <victimProcess id="processc9c0829848" />
 </victim-list>
 <process-list>
  <process id="processc9c0829848" taskpriority="0" logused="0" waitresource="PAGE: 5:1:40600276 " waittime="696" ownerId="255115931225" transactionname="SELECT" lasttranstarted="2019-04-24T09:29:25.950" XDES="0xc8dfa8da40" lockMode="S" schedulerid="13" kpid="8480" status="suspended" spid="245" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2019-04-24T09:29:25.950" lastbatchcompleted="2019-04-24T09:29:25.950" lastattention="1900-01-01T00:00:00.950" clientapp="EntityFramework" hostname="MSR-PRD-BDB02" hostpid="43440" loginname="IUSR_BuildDB" isolationlevel="read committed (2)" xactid="255115931225" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="66" stmtend="7378" sqlhandle="0x02000000638e8b1acc45f82c476cd42914e32866e87c4fd60000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@p__linq__0 int,@p__linq__1 int)SELECT 
[Project1].[CachedBuildStateId] AS [CachedBuildStateId], 
[Project1].[BuildVersionId1] AS [BuildVersionID], 
[Project1].[ProjectID] AS [ProjectID], 
[Project1].[VersionName] AS [VersionName], 
[Project1].[PlatformID] AS [PlatformID], 
[Project1].[VersionPath] AS [VersionPath], 
[Project1].[RegionID] AS [RegionID], 
[Project1].[TestStatusID] AS [TestStatusID], 
[Project1].[TestResult] AS [TestResult], 
[Project1].[TestReportPath] AS [TestReportPath], 
[Project1].[TypeID] AS [TypeID], 
[Project1].[Size] AS [Size], 
[Project1].[VersionDate] AS [VersionDate], 
[Project1].[Approved] AS [Approved], 
[Project1].[Archived] AS [Archived], 
[Project1].[CLData] AS [CLData], 
[Project1].[CLCode] AS [CLCode], 
[Project1].[CLSound] AS [CLSound], 
[Project1].[XDKSDKVersion] AS [XDKSDKVersion], 
[Project1].[Comments] AS [Comments], 
[Project1].[DateAdded] AS [DateAdded], 
[Project1].[DateModified] AS [DateModified], 
[Project1].[CacheLocally] AS [CacheLocally],   </inputbuf>
  </process>
  <process id="processc9bf5cf468" taskpriority="0" logused="436" waitresource="PAGE: 5:1:3752363 " waittime="724" ownerId="255115931408" transactionname="user_transaction" lasttranstarted="2019-04-24T09:29:25.973" XDES="0xcf6b186408" lockMode="IX" schedulerid="25" kpid="11228" status="suspended" spid="209" sbid="2" ecid="0" priority="0" trancount="2" lastbatchstarted="2019-04-24T09:29:25.973" lastbatchcompleted="2019-04-24T09:29:25.970" lastattention="1900-01-01T00:00:00.970" clientapp="EntityFramework" hostname="MSR-PRD-BDB04" hostpid="6248" loginname="IUSR_BuildDB" isolationlevel="read committed (2)" xactid="255115931408" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="78" stmtend="408" sqlhandle="0x020000009438fe362ae846385f4e36448d4eac52a5f052e10000000000000000000000000000000000000000">
unknown    </frame>
    <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown    </frame>
   </executionStack>
   <inputbuf>
(@0 int,@1 datetime,@2 datetime,@3 int)update [dbo].[CachedBuildState]
set [CachingStatusId] = @0, [StartTimeUtc] = @1, [LastUpdateTimeUtc] = @2, [MessageDetails] = null
where ([CachedBuildStateId] = @3)
   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <pagelock fileid="1" pageid="40600276" dbid="5" subresource="FULL" objectname="BuildDB.dbo.CachedBuildState" id="lockcda4d62280" mode="IX" associatedObjectId="72057594075283456">
   <owner-list>
    <owner id="processc9bf5cf468" mode="IX" />
   </owner-list>
   <waiter-list>
    <waiter id="processc9c0829848" mode="S" requestType="wait" />
   </waiter-list>
  </pagelock>
  <pagelock fileid="1" pageid="3752363" dbid="5" subresource="FULL" objectname="BuildDB.dbo.CachedBuildState" id="lockd70db08700" mode="S" associatedObjectId="72057594075283456">
   <owner-list>
    <owner id="processc9c0829848" mode="S" />
   </owner-list>
   <waiter-list>
    <waiter id="processc9bf5cf468" mode="IX" requestType="wait" />
   </waiter-list>
  </pagelock>
 </resource-list>
</deadlock>

回答:


2

あなたは持っているsqlhandleあなたが使用して完全なクエリを取得することができますように、各フレームのためのsys.dm_exec_sql_text機能を:

SELECT text
FROM sys.dm_exec_sql_text(sql_handle)

sys.dm_exec_sql_text

たとえばsys.dm_exec_query_stats、XMLレポートのstatement_start_offset、statement_end_offset、sql_handleの代わりに(stmtstart、stmtend、sqlhandle)からいくつかのステートメントのテキストを取得する

SELECT TOP (100)
    CASE   
        WHEN s.[statement_start_offset] > 0 THEN  
            --The start of the active command is not at the beginning of the full command text 
            CASE s.[statement_end_offset]  
               WHEN -1 THEN  
                  --The end of the full command is also the end of the active statement 
                  SUBSTRING(t.TEXT, (s.[statement_start_offset]/2) + 1, 2147483647) 
               ELSE   
                  --The end of the active statement is not at the end of the full command 
                  SUBSTRING(t.TEXT, (s.[statement_start_offset]/2) + 1, (s.[statement_end_offset] - s.[statement_start_offset])/2+1)   
            END  
        ELSE  
            --1st part of full command is running 
            CASE s.[statement_end_offset]  
               WHEN -1 THEN  
                  --The end of the full command is also the end of the active statement 
                  RTRIM(LTRIM(t.[text]))  
               ELSE  
                  --The end of the active statement is not at the end of the full command 
                  LEFT(t.TEXT, (s.[statement_end_offset]/2) +1)  
            END  
        END AS [executing statement]
FROM sys.dm_exec_query_stats s 
    CROSS APPLY sys.dm_exec_sql_text(s.[sql_handle]) t

UPD

@JohnEisbrenerの合理的なコメントのおかげで、クエリキャッシュが消去されるまでDMVからの情報が実際に存在することに気付くはずです。そのため、キャッシュクリーニング後(サーバーの再起動後など)にその情報を使用する場合は、イベントが発生した直後にそのデータを永続的なテーブルに保存する必要があります。


はい、私はすでにそれをしていましたが、拡張イベントセッションの定義でそれを増やすことができることを願っていました。デッドロックレポートを細断処理し、devleopeprsがそれを振り返るために歴史的な目的のためにすべてをテーブルに入れることができるかどうかを確認しようとしています。残念ながら、彼らはこのアプリケーションにエンティティフレームワークを使用しています。ソリューションが完了したら投稿します
-Snewfie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.