現在オフラインです。再接続するためにインターネットの接続を待っています

[FIX] Sysprocesses システム テーブルのハンドルに対する SQL テキストを返す fn_get_sql 関数

概要
この資料では、以下の変更を実装する、SQL Server 2000 の機能上の修正プログラムについて説明します。
  • この修正プログラムによって、新しい fn_get_sql システム テーブル値関数が作成されます。
  • この修正プログラムによって、以下の 3 つの新しい列が master..sysprocesses システム テーブルの末尾に追加されます。
    • sql_handle (binary)
    • stmt_start (int)
    • stmt_end (int)
  • この修正プログラムによって、新しいトレース フラグ 2861 が作成されます。
解決方法
この問題を解決するには、Microsoft SQL Server 2000 の最新の Service Pack を入手します。関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
290211 最新の SQL Server 2000 Service Pack の入手方法
: 次の修正プログラムは Microsoft SQL Server 2000 Service Pack 3 がリリースされる前に作成されました。

修正プログラム ファイル

fn_get_sql 関数を実装する、SQL Server 2000 の修正プログラムがあります。

Microsoft Product Support Services にお問い合わせのうえ、修正プログラムを入手してください。修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (UTC) で示されています。ファイル情報に表示される時刻は、ローカル時刻に変換されています。UTC とローカル時刻との時差を確認するには、コントロール パネルの [日付と時刻] の [タイム ゾーン] タブを使用してください。
   日付            時刻       バージョン    サイズ              ファイル名   -----------------------------------------------------------------   07/01/2002   4:50 PM   8.00.652   7,285 kilobytes   Sqlservr.exe				
: ファイルの依存関係のため、最新の修正プログラムまたは機能には上記以外の追加ファイルが含まれていることがあります。

重要 : この修正プログラムの機能が必要な場合は、Sqlservr.exe のビルド 8.00.652 以降を適用し、この修正プログラムに含まれている Sp2_qfe_serv_uni.sql ファイルを実行する必要があります。詳細については、修正プログラム ファイルに含まれている Readme.txt ファイルを参照してください。
状況
マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。この問題は、Microsoft SQL Server 2000 Service Pack 3 で最初に修正されました。
詳細
fn_get_sql システム テーブル値関数の定義と構文は以下のとおりです。

fn_get_sql

指定したハンドルで参照される SQL テキストを返します。

構文

fn_get_sql ([@SqlHandle = ]SqlHandle)

引数

[@SqlHandle = ] SqlHandle

バイナリのハンドル値です。SqlHandle は、デフォルト値を持たない binary(20) です。

戻りテーブル

列名データ型説明
dbidsmallintデータベース ID。アドホック SQL ステートメントの場合は NULL です。
objectidintデータベース オブジェクトの ID。アドホック SQL ステートメントの場合は NULL です。
numbersmallintプロシージャがグループ化されている場合は、グループ内の番号。プロシージャではないエントリの場合は 0 です。アドホック SQL ステートメントの場合は NULL です。
encryptedbitオブジェクトが暗号化されているかどうかを示します。
0 = 暗号化されていない
1 = 暗号化されている
TexttextSQL テキスト。暗号化されたオブジェクトの場合は NULL です。

解説

fn_get_sql は、指定した SQLHANDLE の SQL テキストを返すシステム テーブル値関数です。有効な SQLHANDLE は、sysprocesses システム テーブルの sql_handle 列から取得できます。

既にキャッシュに存在しないハンドルを渡した場合、fn_get_sql は空の結果セットを返します。無効なハンドルを渡した場合、バッチが中断され、次のエラー メッセージが表示されます。
サーバー : メッセージ 569、レベル 16、状態 1、プロシージャ fn_get_sql、行 12fn_get_sql に渡されたハンドルが無効でした。
SQL Server では、一括操作のステートメントや 8 KB を超える文字列リテラルを含むステートメントなど、一部の Transact-SQL ステートメントをキャッシュできません。このようなステートメントのハンドルは、fn_get_sql 関数を使用して取得できません。

text 列では、パスワードを含む可能性があるテキストがフィルタ処理されます。監視されないセキュリティ関連のストアド プロシージャの詳細については、SQL Server Books Online の「トレースの制限」を参照してください。

権限

fn_get_sql 関数を実行できるのは、sysadmin 固定サーバー ロールのメンバのみです。

fn_get_sql 関数が返す情報は、DBCC INPUTBUFFER コマンドで返される情報に似ています。次のように DBCC INPUTBUFFER が制限されている場合には、fn_get_sql 関数を使用します。
  • イベントが 255 文字を超える場合。
  • ストアド プロシージャの現在最高のネスト レベルを返す必要がある場合。たとえば、sp_1 および sp_2 という名前の 2 つのストアド プロシージャがあるとします。sp_1 が sp_2 を呼び出し、sp_2 の実行中にハンドルを sysprocesses システム テーブルから取得する場合、fn_get_sql 関数は sp_2 に関する情報を返します。さらに、fn_get_sql 関数は現在最高のネスト レベルでストアド プロシージャ全体を返します。
データベース管理者は、fn_get_sql 関数を使用して、問題のプロセスを診断できます。管理者は問題のサーバー プロセス ID (SPID) を特定した後、その SPID の SQLHANDLE を取得します。次に、このハンドルを指定して fn_get_sql 関数を呼び出し、開始オフセットと終了オフセットを使用して問題の SPID の SQL テキストを特定します。以下に例を示します。
DECLARE @Handle binary(20)SELECT @Handle = sql_handle FROM sysprocesses WHERE spid = 52SELECT * FROM ::fn_get_sql(@Handle) 				
また、fn_get_sql 関数を使用して、サーバーを連続的に監視することもできます。たとえば、sysprocesses システム テーブルから SQLHANDLE、およびステートメントの開始オフセットと終了オフセットを定期的に取得するクライアント ツールがあるとします。そのツールは、SQL ハンドルを一意キーとして、さらに fn_get_sql 関数の結果を値として持つ SQL テキストのキャッシュを管理します。ツールは、sysprocesses システム テーブル行セット内の行ごとに、SQLHANDLE に基づいてそのキャッシュ内のテキストを検索します。テキストがそのツールのキャッシュに存在しない場合、ツールは fn_get_sql 関数を呼び出し、テキストを取得してキャッシュに保存します。

トレース フラグ 2861

トレース フラグ 2861 は、SQL Server がキャッシュにコスト 0 のプランを保持するように指示します。SQL Server は、通常、単純なアドホック クエリ、Set ステートメント、コミット トランザクションなどをキャッシュしません。
  • トレース フラグ 2861 を有効にすると、fn_get_sql 関数は、コスト 0 のプランを含むアクティビティの SQL テキストを返すことができます。トレース フラグ 2861 を無効にすると、fn_get_sql 関数は、コスト 0 のプランを含むアクティビティの SQL テキストを返すことができません。
  • この修正プログラムを適用した場合、デフォルトでは、トレース フラグ 2861 は無効になります。

解説

トレース フラグ 2861 を有効にすると、プロシージャ キャッシュ内のオブジェクト数が増加します。しかし、追加されるオブジェクトは非常に小さいため、プロシージャ キャッシュのメモリ使用量の増加はわずかです。

SQL Server 2000 には、指定した任意の SQL ステートメントのための既存の実行プランを検索するための効率的なアルゴリズムがあります。ただし、プロシージャ キャッシュに格納されるオブジェクト数が増加するため、リレーショナル エンジンが既存のプランを検索する際にかかる時間が増加し、システムのパフォーマンスに悪影響を与える可能性があります。

通常、データベース サイズがメモリ サイズよりも非常に大きいシステムでは、メモリ不足になることが予想されます。他のオブジェクトのためにメモリが必要であるような状況でメモリが不足する場合、lazywriter プロセスはプロシージャ キャッシュ内のオブジェクトの割り当てを解除します。これによって、プロシージャ キャッシュのサイズが適正に保たれ、この変更によって発生する可能性のある悪影響が最小限に抑えられます。

ただし、メモリ サイズがデータベース サイズより大きいシステムでは、通常、メモリ不足になりません。その結果、メモリ不足のためにオブジェクトの割り当てがプロシージャ キャッシュから解除されることはありません。そのため、プロシージャ キャッシュのサイズが、パフォーマンスに悪影響を与える程度まで大きくなることがあります。

システム パフォーマンスに悪影響が出た場合には、以下の手順を実行します。
  1. トレース フラグ 2861 を無効にします。
  2. クエリ アナライザから DBCC FREEPROCCACHE コマンドを実行します。SQL Server を再起動する必要はありません。
プロパティ

文書番号:325607 - 最終更新日: 01/24/2006 08:11:47 - リビジョン: 5.2

  • Microsoft SQL Server 2000 Standard Edition
  • kbhotfixserver kbqfe kbsqlserv2000sp3fix kbfix kbinfo kbsqlserv2000presp3fix KB325607
フィードバック