すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:apsaradb for RDS SQL Serverのブロック問題のトラブルシューティング方法

最終更新日:Jan 18, 2024

説明

Apsaradb for RDS SQL Serverでブロックの問題が発生しています。

原因

アプリケーションがテーブルやリソースを頻繁に読み書きすると、ブロックされる傾向があります。 ブロッキングの問題が深刻な場合、アプリケーション側のステートメントの実行が遅くなります。

解決策

トラブルシューティング

apsaradb For RDS SQL Serverのブロック問題については、以下にトラブルシューティングの提案を示します。

  1. sys.sysprocessesを監視して、ブロッキング情報を取得します。 blocked列の値はblocking header session_idで、waitresourceはブロックされたセッションを待っているリソースです。 操作コードは次のとおりです。

    while 1=1
    始める
    ブロックされたsys.sysprocessesから * を選択 <>0;
    waitfor遅延 '00:00:01'
    終了 
    説明

    ループギャップはカスタマイズできます。 ここでは、例として00:00:01です。

    次のコマンド出力が表示されます。

    説明

    注: 図のフィールドの説明については、「sys.sysprocessesのドキュメント」をご参照ください。

  2. sys.dm_tran_locks、sys.dm_os_waiting_tasksおよびその他のビューをサイクルモニタリングすると、ブロックグラフを取得できます。 Request_session_idはblocked session_idを示し、RequestingTextはblockedステートメントを示し、blocking_session_idはblocking session_idヘッダーを示し、BlockingTextはblockingヘッダーステートメントを示します。 操作コードは次のとおりです。

    while 1=1
    始める
    SELEC T db.name DBName、
           tl.request_session_id、wt.blocking_session_id、OBJECT_NAME(p.OBJECT_ID) BlockedObjectName、
                                        tl.resource_type,
                                        h1.TEXT AS RequestingText,
                                        h2.TEXT AS BlockingText、
                                        tl.request_mode
    FROM sys.dm_tran_locks AS tl
    INNER JOIN sys. database_id db ON db.database_id = tl.resource_database_id
    INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
    INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
    INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
    INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
    CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
    CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
    waitfor遅延 '00:00:01'
    終了 

    次のコマンド出力が表示されます。

    説明
    • DBName: データベースの名前。

    • request_session_id: ブロックされたセッションのID。

    • blocking_session_id: ブロックヘッダセッションのID。

    • BlockedObjectName: ブロックされたセッション操作のオブジェクト。

    • resource_type: 要求されたリソースのタイプ。

    • RequestingText: 現在のセッションで実行されたステートメント、つまりブロックされたステートメント。

    • BlockingText: セッションヘッダーによって実行されるステートメントをブロックします。

    • request_mode: 現在のセッションによって要求されたロックモード。

おすすめ

設定を最適化するには、次の手順に従います。

  1. ブロッキングヘッド接続を閉じると、ブロッキングをすばやく軽減できます。

  2. トランザクションが長期間送信されていないかどうかを確認し、時間内にトランザクションを送信します。

  3. ロックがブロックに含まれており、ダーティな読み取りが許可されている場合は、クエリのヒントをnolockで使用して、クエリ文がロックを要求し、ブロックを回避できるようにします。たとえば、select * from table with(nolock); などです。

  4. アプリケーションロジックを確認して、リソースに順番にアクセスします。

適用範囲

  • ApsaraDB RDS for SQL Server