web-dev-qa-db-ja.com

DBCC INPUTBUFFERを使用してspidに関連付けられたクエリを検索する場合、そのクエリの変数値を表示する方法はありますか?

深刻なブロッキングの問題があるデータベース内の問題のトラブルシューティングを行っています。

しばらく前に、そのspidに対して実行されたクエリを確認できるコマンドDBCC INPUTBUFFERを見つけました。これを使用して、何が実行され、問題が発生しているかを確認しました。

私が混乱しているのは、DBCC INPUTBUFFERが表示するクエリに、クエリに関連付けられている変数が含まれていないことです。たとえば、クエリがテーブルの@IDで結合された場合、DBCC INPUTBUFFERによって提供されたクエリは@ID値を表示しません。

どの変数がクエリに関連付けられているかを確認する方法があるかどうか疑問に思っています。および/またはこれが標準ではなく、通常はDBCC INPUTBUFFERがクエリに関連付けられた変数を表示する場合。

後者の場合、私の問題はおそらく変数が提供されておらず、かなり巨大なテーブルのセットをクエリして永遠を取得しているという事実にあります。

2
User Smith

深刻なブロッキングの問題があるデータベース内の問題のトラブルシューティングを行っています。どの変数がクエリに関連付けられているかを確認する方法があるかどうか疑問に思っています。

ブロッキングの問題のトラブルシューティングには、以下のいずれかを使用することをお勧めします。

  1. 使用できますbeta_lockinfo Erland Sommarskogによる

    beta_lockinfoは、プロセスとプロセスが保持するロック、およびアクティブなトランザクションに関する情報を提供するストアドプロシージャです。 beta_lockinfoは、ブロッキング状況に関するできるだけ多くの情報を収集するように設計されているため、状況が絶望的な場合は、原因を即座に見つけてブロッキングプロセスを強制終了できます。次に、座ってbeta_lockinfoからの出力を分析して、ブロッキング状況がどのように発生したかを理解し、状況の再発を防ぐために実行するアクションを把握できます。 beta_lockinfoからの出力には、すべてのアクティブプロセスと、ロック付きのパッシブプロセス、ロックするオブジェクト、最後に送信したコマンド、実行しているステートメントが表示されます。また、現在のステートメントのクエリプランも取得します。通常、beta_lockinfoを実行して出力を直接確認しますが、データがテーブルに保存されるアーカイブモードもあります。これは、自分にアクセスできないサイトでbeta_lockinfoからの出力を誰かに送信してもらいたい場合に最も役立ちます。

  2. 別の方法は、を使用することですsp_whoIsActive Adam Machanicによるwith @get_locks = 1 and データを分析用のテーブルにダンプする

    EXEC sp_WhoIsActive 
    @filter = '', 
    @filter_type = 'session', 
    @not_filter = '', 
    @not_filter_type = 'session', 
    @show_own_spid = 0, 
    @show_system_spids = 0, 
    @show_sleeping_spids = 0, 
    @get_full_inner_text = 1, ----------> 1 will get full inner text of query
    @get_plans = 1, 
    @get_outer_command = 1,   ----------> 1 will get outer command of query
    @get_transaction_info = 0, 
    @get_task_info = 1, 
    @get_locks = 1,   ----------> 1 = ON (get lock info); 0 = OFF
    @get_avg_time = 0, 
    @get_additional_info = 0, 
    @find_block_leaders = 1,   --> 1 = will find Lead blockers
    @delta_interval = 0, 
    @output_column_list = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]', 
    @sort_order = '[start_time] ASC', 
    @format_output = 1, 
    @destination_table = '', 
    @return_schema = 0, 
    @schema = NULL, 
    @help = 0
    
  3. Blocked Process Report Event Class のような他の方法があります。または、SQL Server 2008以降を使用している場合は、 Extended events ですが、上記の方法で詳細がわかります。あまり努力せずに探しています。

1
Kin Shah