開いているカーソル情報の一覧を出力する:SQL Server動的管理ビューレファレンス(47)
「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は、開いているカーソル情報の一覧の出力について解説します。
本連載では、「Microsoft SQL Server(以下、SQL Server)」で使用可能な動的管理ビューについて、動作概要や出力内容などを紹介していきます。今回は動的管理ビュー「sys.dm_exec_cursors」における、開いているカーソル情報の一覧の出力について解説します。対応バージョンは、SQL Server 2012以降です。
概要
SQL Serverではカーソルを使用して、クエリ結果の行の繰り返し処理を行うことができます。カーソルの種類には順方向専用カーソルや静的カーソル、キーセットドリブンカーソル、動的カーソルがあり、カーソルの種類によって他のトランザクションによるデータ変更時の影響や値の取り出し方が異なります。また、カーソルの種類によっては、結果セットやキーセットなどの一時的な保持に「tempdb」が使用されるものもあります。
「sys.dm_exec_cursors」動的管理関数を出力することで、サーバ全体で開いているカーソルの一覧情報や指定したセッションで開かれているカーソル情報を出力できます。そのため、カーソルを使用したクエリのデバッグや、カーソル使用中に発生したリソース消費の増加や処理遅延などのトラブルへの対応に役立てられます。
構文と引数
構文 sys.dm_exec_cursors(session_id)
引数名 | データ型 | 説明 |
---|---|---|
session_id | int | セッションID 「session_id」が指定されている場合、指定されたセッションのカーソルに関する情報を返す 「0」を指定すると、全てのセッションの全てのカーソルに関する情報を返す |
出力内容
列名 | データ型 | 説明 |
---|---|---|
session_id | int | このカーソルを保持しているセッションのID |
cursor_id | int | カーソルオブジェクトのID |
name | nvarchar(256) | カーソルの名前 |
properties | nvarchar(256) | カーソルのプロパティ 次のプロパティの値が連結された値が返される 宣言インタフェース カーソルの種類 カーソルの同時実行 カーソルのスコープ カーソルの入れ子レベル 出力例 「TSQL | Dynamic | Optimistic | Global(0)」 |
sql_handle | varbinary(64) | カーソルを宣言したバッチのテキストハンドル |
statement_start_offset | int | 現在実行中のステートメントが開始された、バッチまたはストアドプロシージャの中での文字数 「sql_handle」や「statement_end_offset」「sys.dm_exec_sql_text」動的管理関数から、現在要求中のステートメントを特定できる |
statement_end_offset | int | 現在実行中のステートメントが終了する、バッチまたはストアドプロシージャの中での文字数 |
plan_generation_num | bigint | 再コンパイル後のプランのインスタンスを区別するために使用できるシーケンス番号 |
creation_time | datetime | カーソルが作成されたタイムスタンプ |
is_open | bit | カーソルが開いているかどうか |
is_async_population | bit | バックグラウンドスレッドが非同期に「KEYSET」または「STATIC」カーソルを生成しているかどうか |
is_close_on_commit | bit | 「CURSOR_CLOSE_ON_COMMIT」を使用して、カーソルが宣言されているかどうか 1=カーソルはトランザクションが終了したときに閉じられる |
fetch_status | int | カーソルの最後のフェッチステータスを返す 最後に返された「@@FETCH_STATUS」値 |
fetch_buffer_size | int | フェッチバッファーのサイズに関する情報を返す |
fetch_buffer_start | int | 「FAST_FORWARD」「DYNAMIC」カーソルの場合 カーソルが開いていない場合、またはカーソルが最初の行の前にある場合は「0」 それ以外の場合は「-1」 「STATIC」カーソルと「KEYSET」カーソルの場合 カーソルが開いていない場合は「0」 カーソルが最後の行を超えている場合は「-1」 それ以外の場合は配置されている行番号 |
ansi_position | int | カーソルのフェッチバッファー内の位置 |
worker_time | bigint | このカーソルを実行するワーカーによって費やされた時間(マイクロ秒) |
reads | bigint | カーソルで実行された読み取りの数 |
writes | bigint | カーソルで実行された書き込みの数 |
dormant_duration | bigint | このカーソルの最後のクエリ(オープンまたはフェッチ)が開始されてからのミリ秒 |
出力例
カーソルを作成しフェッチを何回か実行した後に、セッションIDを引数に指定して「sys.dm_exec_cursors」動的管理関数を出力します(図1、2)。
開いているカーソルの種類に関する情報や、ワーカー使用時間などのリソース消費に関する情報を確認することができました。
次に、セッションから「0」を引数に指定して、サーバ全体を対象に「sys.dm_exec_cursors」動的管理関数を出力します(図3)。
先ほどとは別のセッションのカーソル情報を含んだ、サーバ全体で開かれているカーソルの一覧が表示されました。
※本Tipsは、「Windows Server 2019」上に「SQL Server 2019 CTP2.5」をインストールした環境を想定して解説しています。
筆者紹介
椎名 武史(しいな たけし)
日本ユニシス株式会社所属。Microsoft MVP for Data Platform(2017〜)。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。
伊東 敏章(いとう としあき)
日本ユニシス株式会社所属。入社以来SQL Server一筋で評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。社内のプログラミングコンテストで4回の優勝経験も持つ。趣味は輪行で週末は自転車を持っての旅行。目標は色々な日本百選を制覇すること。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- SQL Serverの動的管理ビューとは?
「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。 - 「DMV(Dynamic Management View)」でパフォーマンス遅延の「原因」を調べる
本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「処理遅延の原因を追求する“DMVの使い方”」を説明します。 - SQL Serverの動きを制御する「トレースフラグ」とは何か
「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「トレースフラグ」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。初回は「トレースフラグとはそもそも何か」を解説します。