sql >> データベース >  >> RDS >> Sqlserver

SQL Server Ro14でデッドロックの理由を見つける方法は?

    デッドロック情報はsystem_healthによってキャプチャされます デフォルトでは、拡張イベントトレース。追加のトレースフラグをオンにする必要はありません。

    xml_deadlockからの情報 イベントは、SSMSオブジェクトエクスプローラー([管理]->[拡張イベント]->[セッション]--system_health)またはT-SQLで表示できます。以下は、ファイルターゲットからデッドロックxmlを取得するためのクエリの例です。デッドロックxmlをxdlを使用してファイルに保存することもできます 拡張機能を使用してファイルをSSMSで開き、デッドロックをグラフィカルに表示します。

    --get xml_deadlock_report from system_health session file target
    WITH
          --get full path to current system_health trace file
          CurrentSystemHealthTraceFile AS (
            SELECT CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') AS FileName
            FROM sys.dm_xe_session_targets
            WHERE
                target_name = 'event_file'
                AND CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') LIKE '%\system[_]health%'
        )
          --get trace folder name and add base name of system_health trace file with wildcard
        , BaseSystemHealthFileName AS (
            SELECT 
                REVERSE(SUBSTRING(REVERSE(FileName), CHARINDEX(N'\', REVERSE(FileName)), 255)) + N'system_health*.xel' AS FileNamePattern
            FROM CurrentSystemHealthTraceFile
            )
          --get xml_deadlock_report events from all system_health trace files
        , DeadLockReports AS (
            SELECT CAST(event_data AS xml) AS event_data
            FROM BaseSystemHealthFileName
            CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS xed
            WHERE xed.object_name like 'xml_deadlock_report'
        )
    --display 10 most recent deadlocks
    SELECT TOP 10
          DATEADD(hour, DATEDIFF(hour, SYSUTCDATETIME(), SYSDATETIME()), event_data.value('(/event/@timestamp)[1]', 'datetime2')) AS LocalTime
        , event_data AS DeadlockReport
    FROM DeadLockReports
    ORDER BY LocalTime ASC;
    


    1. SQL ServerでのCAST()のしくみ

    2. SQLiteでの日付による全順序の実行

    3. Oracleでタイムゾーンを変更する4つの方法

    4. MySQL:フィールドを0に設定してすべての行を更新しますが、1つの行のフィールドを1に設定します