検索
連載

開いているカーソル情報の一覧を出力するSQL Server動的管理ビューレファレンス(47)

「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「動的管理ビュー」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は、開いているカーソル情報の一覧の出力について解説します。

Share
Tweet
LINE
Hatena

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)。

図1
図1 カーソルを10秒ごとにフェッチしていくクエリ
図2
図2 カーソルを実行するセッションを引数に指定して「sys.dm_exec_cursors」動的管理関数を出力した

 開いているカーソルの種類に関する情報や、ワーカー使用時間などのリソース消費に関する情報を確認することができました。

 次に、セッションから「0」を引数に指定して、サーバ全体を対象に「sys.dm_exec_cursors」動的管理関数を出力します(図3)。

図3
図3 引数に「0」を指定して、サーバ全体のカーソル情報を出力したところ

 先ほどとは別のセッションのカーソル情報を含んだ、サーバ全体で開かれているカーソルの一覧が表示されました。

※本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.

ページトップに戻る