SQL Extended Events Session สำหรับการตรวจจับการชะงักงัน


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(stmtstart, stmtend, sqlhandle แทนที่จะเป็น statement_start_offset, statement_end_offset, sql_handle ในรายงาน XML)

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 เพื่อมองย้อนกลับไป น่าเศร้าที่พวกเขากำลังใช้เฟรมเวิร์กเอนทิตีสำหรับ applciaiton นี้ จะโพสต์วิธีแก้ปัญหาของฉันเมื่อทำเสร็จแล้ว
Snewfie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.