Zabbixを使用してMS SQL Serverデータベースを追跡する

まえがき


多くの場合、データベース(データベース)に関連する問題について、管理者にリアルタイムで報告する必要があります。

この記事では、MS SQL Serverデータベースを監視するためにZabbixで設定する必要があるものについて説明します。

これらの設定方法に関する詳細はないことに注意してください。ただし、式と一般的な推奨事項、およびストアドプロシージャを介したユーザーデータ要素の追加の詳細な説明は、この記事で説明します。
また、ここでは基本的なパフォーマンスカウンターのみを検討します。

解決策


最初に、必要なすべてのパフォーマンスカウンターを(Zabbixのデータ要素を介して)説明します。
  1. 論理ディスク
    1. 平均ディスク秒/読み取り
      ディスクからデータを読み取る平均時間を秒単位で表示します。 平均パフォーマンスカウンター平均。 Disk sec / Readは10ミリ秒を超えてはなりません。 Avgパフォーマンスカウンターの最大値。 Disk sec / Readは50ミリ秒を超えてはなりません。

      Zabbix :perf_counter [\ LogicalDisk(_Total)\ Avg。 Disk sec / Read]。目的のドライブを追跡することも重要です。たとえば、perf_counter [\ LogicalDisk(C :) \ Avg。 ディスク秒/読み取り]

      トリガーの例
      {ノード名:perf_counter [\ LogicalDisk(_Total)\ Avg。 ディスク秒/読み取り] .last()}> 0.005、レベル高
      そして
      {ノード名:perf_counter [\ LogicalDisk(_Total)\ Avg。 ディスク秒/読み取り] .last()}> 0.0025、中間レベル
    2. 平均ディスク秒/書き込み
      ディスクにデータを書き込む平均時間を秒単位で表示します。 平均パフォーマンスカウンター平均。 ディスク秒/書き込みは10ミリ秒を超えてはなりません。 Avgパフォーマンスカウンターの最大値。 ディスク秒/書き込みは50ミリ秒を超えてはなりません。

      Zabbix :perf_counter [\ LogicalDisk(_Total)\ Avg。 Disk sec / Write]。目的のドライブを追跡することも重要です。たとえば、perf_counter [\ LogicalDisk(C :) \ Avg。 ディスク秒/書き込み]

      トリガーの例
      {ノード名:perf_counter [\ LogicalDisk(_Total)\ Avg。 ディスク秒/書き込み] .last()}> 0.005、高レベル
      そして
      {ノード名:perf_counter [\ LogicalDisk(_Total)\ Avg。 ディスク秒/書き込み] .last()}> 0.0025、中間レベル
    3. 平均ディスクキューの長さ

      ディスク要求キューの平均長。 特定の時間間隔中に処理を待機しているディスク要求の数を表示します。 単一ディスクのキューが2以下である場合は、正常と見なされます。 キューに3つ以上の要求がある場合、おそらくディスクが過負荷になり、着信要求を処理する時間がありません。 Avgカウンターを使用して、ディスクが処理できない操作を指定できます。 ディスク読み取りキューの長さと平均 ディスクライトキューの長さ。
      平均値。 ディスクキューの長さは測定されませんが、数学的なキューイング理論からリトルの法則に従って計算されます。 この法律によれば、処理を保留しているリクエストの数は、平均してリクエストの受信頻度にリクエストの処理時間を掛けたものに等しくなります。 すなわち 私たちの場合、平均 ディスクキューの長さ=(ディスク転送/秒)*(平均ディスク秒/転送)。

      平均 ディスクキューの長さは、ディスクサブシステムの負荷を決定するための主要なカウンターの1つとして与えられますが、適切な評価を行うには、ストレージシステムの物理構造を正確に表す必要があります。 たとえば、単一のハードディスクの場合、2より大きい値は重要と見なされ、ディスクが4つのディスクのRAIDアレイ上にある場合、値が4 * 2 = 8より大きいかどうかを心配する必要があります。

      Zabbix :perf_counter [\ LogicalDisk(_Total)\ Avg。 ディスクキューの長さ]、および目的のディスクを追跡することも重要です。たとえば、perf_counter [\ LogicalDisk(C :) \ Avg。 ディスクキューの長さ]

  2. 記憶
    1. ページ/秒
      アクセス時にRAMにロードされなかったメモリのページへのアクセスを許可するために、SQL Serverがディスクから読み取りまたはディスクに書き込んだページ数を示します。 この値は、ページ入力/秒およびページ出力/秒の値の合計であり、アプリケーションデータファイルにアクセスするためのシステムキャッシュのページ交換(スワップ/スワップ)も考慮します。 さらに、これには、メモリに直接マップされた非キャッシュファイルのスワッピングが含まれます。 これは、メモリ使用量と関連する過剰なページ交換に大きな負荷がある場合に監視する必要があるメインカウンタです。 このカウンターはスワップ値を特徴付け、その通常(非ピーク)値はゼロに近いはずです。 スワップの増加は、RAMを増やすか、サーバーで実行されるアプリケーションの数を減らす必要があることを示します。

      Zabbix :perf_counter [\メモリ\ページ/秒]
      トリガーの例
      {ノード名:perf_counter [\メモリ\ページ/秒] .min(5m)}> 1000、レベル情報
    2. ページフォールト/秒

      これは、ページエラーカウンターの値です。 プロセスがRAMのワーキングセットにない仮想メモリページを参照すると、ページエラーが発生します。 このカウンターは、ディスクへのアクセスを必要とするページエラーと、RAMのワーキングセットの外側にあるページによって引き起こされるエラーの両方を考慮します。 ほとんどのプロセッサは、2番目のタイプのページエラーを大きな遅延なく処理できます。 ただし、ディスクアクセスを必要とする最初のタイプのページのエラー処理により、大幅な遅延が発生する可能性があります。

      Zabbix :perf_counter [\メモリ\ページフォールト/秒]
      トリガーの例
      {ノード名:perf_counter [\メモリ\ページフォールト/秒] .min(5m)}> 1000、レベル情報
    3. 利用可能なバイト

      さまざまなプロセスで使用可能なメモリの量をバイト単位で監視します。 低い測定値はメモリ不足を意味します。 解決策は、メモリを増やすことです。 ほとんどの場合、このカウンタは常に5000 kWを超えている必要があります。
      次の理由により、Available Mbytesのしきい値を手動で設定することは理にかなっています。

      •50%の空きメモリが利用可能=すばらしい
      •利用可能なメモリの25%=注意が必要
      •10%無料=考えられる問題
      •使用可能なメモリの5%未満=速度に重要なため、介入する必要があります。
      Zabbix :perf_counter [\メモリ\利用可能なバイト]

  3. プロセッサー(合計):%Processor Time
    このカウンタは、プロセッサが非アイドルスレッドの操作の実行でビジーであった時間の割合を示します。 この値は、有用な作業の実装に起因する時間のほんの一部と見なすことができます。 各プロセッサは、他のスレッドによって使用されない非生産的なプロセッササイクルを消費するアイドルスレッドに割り当てることができます。 このカウンターは、100%に達する可能性のある短いピークによって特徴付けられます。 ただし、プロセッサー使用率が80%を超える期間が長い場合、より多くのプロセッサーを使用するとシステムの効率が向上します。

    Zabbix :perf_counter [\ Processor(_Total)\%Processor Time]、カーネルを出力する場所もあります
    トリガーの例
    {ノード名:perf_counter [\ Processor(_Total)\%Processor Time] .min(5m)}> 80、level-info
  4. ネットワークインターフェイス(*):合計バイト数/秒
    すべてのインターフェースで1秒間に送受信された合計バイト数。 これは、インターフェース帯域幅(バイト単位)です。 このカウンタの値をネットワークカードの最大帯域幅と比較する必要があります。 通常、このカウンターは、ネットワークアダプターの帯域幅の使用率が50%を超えないようにする必要があります。
    Zabbix :perf_counter [\ネットワークインターフェース(*)\送信バイト/秒]
  5. MS SQL Server:アクセス方法
    SQL Serverのアクセスメソッドオブジェクトは、データベース内の論理データへのアクセスを監視するのに役立つカウンターを提供します。 ディスク上のデータベースページへの物理アクセスは、バッファーマネージャーカウンターを使用して制御されます。 データベースアクセス方法の監視は、インデックスの追加または変更、セクションの追加または移動、ファイルまたはファイルグループの追加、インデックスの最適化、またはクエリのテキストの変更によって、クエリのパフォーマンスを改善できるかどうかを判断するのに役立ちます。 さらに、アクセス方法オブジェクトカウンターを使用して、データのサイズ、インデックス、およびデータベース内の空き領域を監視し、各サーバーインスタンスのボリュームと断片化を制御できます。 インデックスの断片化が多すぎると、パフォーマンスが大幅に低下する可能性があります。
    1. ページ分割/秒
      インデックスページのオーバーフローに起因する1秒あたりの改ページの数。 このインジケーターの高い値は、データを挿入および変更する操作を実行するときに、SQL Serverが大量のリソースを消費する操作を実行してページを分割し、既存のページの一部を新しい場所に移動する必要があることを意味します。 このような操作は可能な限り回避する必要があります。 次の2つの方法で問題を解決できます。
      -自動インクリメント列のクラスター化インデックスを作成します。 この場合、新しいレコードは既にデータが占有しているページ内には配置されませんが、常に新しいページを占有します。
      -Fillfactorパラメーターの値を増やしてインデックスを再構築します。 このパラメーターを使用すると、ページ分割操作を実行することなく、新しいデータを配置するために使用されるインデックスページの空き領域を予約できます。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:アクセス方法\ページ分割/秒"、30]
      トリガーの例 :{ノード名:perf_counter ["\ MSSQL $インスタンス名:Access Methods \ Page Splits / sec"、30] .last()}> {ノード名:perf_counter ["\ MSSQL $インスタンス名:SQL Statistics \ Batch Requests 、30] .last()} / 5、レベル情報
    2. フルスキャン/秒
      1秒あたりの無制限のフルスキャン操作の数。 このような操作には、メインテーブルのスキャンとフルインデックススキャンが含まれます。 この指標の安定した増加は、システムの劣化(必要なインデックスの欠如、その強力な断片化、既存のインデックスのオプティマイザによる不使用、未使用のインデックスの存在)を示している場合があります。 ただし、テーブル全体をRAMに配置すると、フルスキャンが高速になるため、小さなテーブルでのフルスキャンが必ずしも悪いわけではないことに注意してください。 ただし、ほとんどの場合、このカウンタのインジケータの着実な増加は、システムの劣化を示します。 これはすべてOLTPシステムにのみ適用されます。 OLAPシステムでは、常時フルスキャンが正常です。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:アクセス方法\フルスキャン/秒"、30]

  6. MS SQL Server:バッファーマネージャー
    Buffer Managerオブジェクトは、SQL Serverが次のリソースをどのように使用するかを監視するカウンターを提供します。
    -データページを保存するためのメモリ。
    -SQL Serverがデータベースページを読み書きするときに物理I / Oを監視するために使用されるカウンター。
    -ソリッドステートドライブ(SSD)などの高速な不揮発性メモリを使用してバッファキャッシュを拡張するためのバッファプールの拡張。
    -SQL Serverが使用するメモリとカウンタを監視すると、次の情報を取得できます。
    -物理メモリの不足が原因でボトルネックがありますか。 頻繁に使用されるデータをキャッシュできない場合、SQL Serverはそのデータをディスクから強制的に読み取ります。
    -メモリの量を増やすか、データのキャッシュや内部SQL Server構造の保存に追加のメモリを割り当てることで、クエリ実行の効率を上げることは可能ですか?
    -SQL Serverがディスクからデータを読み取る頻度。 メモリへのアクセスなどの他の操作と比較すると、物理I / Oには時間がかかります。 I / Oを減らすと、クエリのパフォーマンスが向上します。
    1. バッファキャッシュヒットラジオ
      SQL Serverがキャッシュバッファーにデータを完全に割り当てることができる方法を示します。 この値が高いほど良い SQLサーバーのデータページに効果的にアクセスするには、それらがキャッシュバッファーに存在し、物理I / O(I / O)操作が存在しない必要があります。 このカウンターの平均値の着実な減少が観察される場合は、RAMの追加を検討してください。 このインジケータは、OLTPシステムでは常に90%を超え、OLAPシステムでは50%を超える必要があります。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:バッファマネージャ\バッファキャッシュヒット率"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Buffer Manager \ Buffer cache hit ratio"、30] .last()} <70、level-high
      そして
      {NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:バッファーマネージャー\バッファーキャッシュヒット率"、30] .last()} <80、レベル平均
    2. ページの平均寿命
      現在の状態でページがメモリ内に残る時間を示します。 値が絶えず低下している場合、これはシステムがバッファプールを乱用していることを意味します。 したがって、潜在的にメモリのパフォーマンスが原因で問題が発生し、パフォーマンスが低下する可能性があります。 システムがバッファプールを悪用していることを明確に判断できる普遍的なインジケータはありません(300秒のインジケータはMS SQL Server 2012以降廃止されています)。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:バッファーマネージャー\ページの平均寿命"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Buffer Manager \ Page life expectancy"、30] .last()} <5、レベル情報

  7. MS SQL Server:一般統計
    SQL Serverの一般統計オブジェクトは、同時接続の数や、SQL Serverのインスタンスが実行されているコンピューターに接続または切断する1秒あたりのユーザー数など、サーバー全体のアクティビティを監視できるカウンターを提供します。 これらのメトリックは、多数のクライアントがSQL Serverのインスタンスに常時接続および切断している大規模なオンライントランザクション処理(OLTP)システムで役立ちます。
    1. ブロックされたプロセス
      現在ブロックされているプロセスの数。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:一般統計\プロセスブロック"、30]
      トリガーの例 :({NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:General Statistics \ Processes blocked"、30] .min(2m、0)}> = 0)
      および({NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:General Statistics \ Processes block"、30] .time(0)}> = 50000)
      および({NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:General Statistics \ Processes blocked"、30] .time(0)} <= 230000)、レベル情報(05:00から23:00までのアラーム制限があります) )
    2. ユーザー接続
      現在SQL Serverに接続しているユーザーの数。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE NAME:General Statistics \ User Connections"、30]

  8. MS SQL Server:ロック
    Microsoft SQL ServerのLocksオブジェクトは、個々のリソースタイプに対して取得されたSQL Serverロックに関する情報を提供します。 複数のトランザクションがリソースを同時に使用することを防ぐために、トランザクションによって読み取られた行や変更された行などのSQL Serverリソースに対してロックが発行されます。 たとえば、テーブルの行のトランザクションが排他(X)ロックを受け取った場合、他のトランザクションはロックが解除されるまでこの行を変更できません。 ロックの使用を最小限にすると、同時実行性が向上し、全体的なパフォーマンスが向上します。 Locksオブジェクトの複数のインスタンスを同時に追跡できます。各インスタンスは、個別のタイプのリソースのロックになります。
    1. 平均待機時間(ミリ秒)
      待機が必要なすべてのロック要求の平均待機時間(ミリ秒)。 このカウンタは、リソースをロックするために、ユーザープロセスが平均してどれだけキューに入れる必要があるかを示します。 このカウンターの最大許容値はタスクに完全に依存します。ここですべてのアプリケーションの平均値を決定することは困難です。 このカウンタの設定が高すぎると、データベースのロックに問題がある可能性があります。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:ロック(_Total)\平均待機時間(ms)"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Average Wait Time(ms)"、30] .last()}> = 500、レベル情報
    2. ロック待機時間(ミリ秒)
      最後の1秒間の合計ロック待機時間(ミリ秒)。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:ロック(_Total)\ロック待機時間(ms)"、30]
    3. ロック待機/秒
      ロック要求に関連してスレッドが待機する必要があった最後の1秒間のケースの数。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Lock Waits / sec"、30]
    4. ロックタイムアウト/秒
      サイクリックアクセスでロックを取得できない場合の繰り返し回数。 SQL Serverスピンカウンター構成パラメーターの値は、タイムアウトが期限切れになり、スレッドが非アクティブ状態になるまでのスレッドの「スピン」の数を決定します。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Lock Timeouts / sec"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Locks(_Total)\ Lock Timeouts / sec"、30] .last()}> 1000、レベル情報
    5. ロック要求/秒
      指定されたロックタイプの1秒あたりのリクエスト数。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Lock Requests / sec"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Lock Requests / sec"、30] .last()}> 500000、レベル情報
    6. デッドロックのロック数/秒
      デッドロックにつながる1秒あたりのロック要求の数。 デッドロックの存在は、共有リソースをブロックする不適切に構築されたクエリを示します。
      Zabbix :perf_counter ["\ MSSQL $インスタンス名:デッドロック数/秒"、30]
      トリガーの例 :{NODE_NAME:perf_counter ["\ MSSQL $ INSTANCE_NAME:Locks(_Total)\ Number of Deadlocks / sec"、30] .last()}> 1、level-high

  9. MS SQL Server:メモリマネージャー
    Microsoft SQL Serverのメモリマネージャーオブジェクトは、サーバー全体のメモリ使用量を監視するためのカウンターを提供します。 サーバー全体のメモリ使用量を監視してユーザーアクティビティとリソース使用率を評価すると、パフォーマンスの低下を特定するのに役立ちます。 SQL Serverのインスタンスで使用されるメモリ制御は、以下を決定するのに役立ちます。
    -頻繁に使用されるデータをキャッシュに保存するのに不十分な物理メモリにギャップがありますか。 十分なメモリがない場合、SQL Serverはディスクからデータを取得する必要があります。
    -メモリを追加した場合、またはデータまたは内部SQL Server構造をキャッシュするために使用可能なメモリの量を増やした場合、クエリのパフォーマンスが向上します。
    1. メモリ許可
      ワークスペースメモリを正常に受信したプロセスの総数を示します。 インディケーターが安定して低下した場合、RAMを増やす必要があります。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE NAME:メモリマネージャー\メモリ許可未解決"、30]
    2. メモリ許可
      作業メモリの提供を待機しているプロセスの総数を示します。 安定した成長率では、RAMを増やす必要があります。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE NAME:メモリマネージャー\メモリ許可保留中"、30]

  10. MS SQL Server:統計
    Microsoft SQL ServerのStatisticsオブジェクトは、SQL Serverのインスタンスに送信されたクエリのコンパイルと種類を監視するためのカウンターを提供します。 クエリのコンパイルと再コンパイルの数、およびSQL Serverのインスタンスが受信したパッケージの数を監視すると、SQL Serverがユーザークエリを実行する速度と、クエリオプティマイザーがそれらを効率的に処理する方法がわかります。
    1. バッチリクエスト/秒
      1秒あたりに受信したTransact-SQLコマンドパケットの数。 これらの統計は、制限(入力/出力、ユーザー数、キャッシュサイズ、クエリの複雑さなど)の影響を受けます。 大量のパケット要求は、高いスループットを示します。
      Zabbix :perf_counter ["\ MSSQL $ INSTANCE_NAME:SQL Statistics \ Batch Requests / sec"、30]


上記のすべてに加えて、他のデータ要素を構成することもできます(さらに、後続の通知でそれらのトリガーを作成します)。
1)空きディスク容量
2)データベースデータファイルとログログのサイズ
など
ただし、これらのインジケータはすべて、クエリの問題をリアルタイムで表示するわけではありません。
これを行うには、独自の特別なカウンターを作成します。
プライバシーを考慮して、このようなカウンターの例は示しません。 さらに、システムごとに一意に構成されます。 ただし、1C、NAV、CRMなどのシステムでは、対応する開発者と一緒に専用のカウンターを作成できることに注意してください。
各時点で実行されている要求の数と実行を待機している要求(中断またはブロックされている)の数を示す一般的なインジケーターを作成する例を示します。
これを行うには、ストアドプロシージャを作成します。
コード
USE [__] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [nav].[ZabbixGetCountRequestStatus] @Status nvarchar(255) AS BEGIN /*  -     */ SET NOCOUNT ON; select count(*) as [Count] from sys.dm_exec_requests ER with(readuncommitted) where [status]=@Status END 


次に、Zabbixが配置されているフォルダー(zabbix \ conf \ userparams.d)に移動し、ps1拡張子を持つ2つのファイル(PowerShell)を作成し、それぞれに次のコードを記述します。
クエリを実行するためのコード
 $SQLServer = "_"; $uid = ""; $pwd = ""; $Status="running"; $connectionString = "Server = $SQLServer; Database=_; Integrated Security = False; User ID = $uid; Password = $pwd;"; $connection = New-Object System.Data.SqlClient.SqlConnection; $connection.ConnectionString = $connectionString; #    MSSQL / Create a request directly to MSSQL $SqlCmd = New-Object System.Data.SqlClient.SqlCommand; $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure; $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus"; $SqlCmd.Connection = $Connection; $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar); $paramStatus.Value = $Status; $connection.Open(); $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter; $SqlAdapter.SelectCommand = $SqlCmd; $DataSet = New-Object System.Data.DataSet; $SqlAdapter.Fill($DataSet) > $null; $connection.Close(); $result = $DataSet.Tables[0].Rows[0]["Count"]; write-host $result; 


保留中のリクエストのコード
 $SQLServer = "_"; $uid = ""; $pwd = ""; $Status="suspended"; $connectionString = "Server = $SQLServer; Database=_; Integrated Security = False; User ID = $uid; Password = $pwd;"; $connection = New-Object System.Data.SqlClient.SqlConnection; $connection.ConnectionString = $connectionString; #    MSSQL / Create a request directly to MSSQL $SqlCmd = New-Object System.Data.SqlClient.SqlCommand; $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure; $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus"; $SqlCmd.Connection = $Connection; $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar); $paramStatus.Value = $Status; $connection.Open(); $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter; $SqlAdapter.SelectCommand = $SqlCmd; $DataSet = New-Object System.Data.DataSet; $SqlAdapter.Fill($DataSet) > $null; $connection.Close(); $result = $DataSet.Tables[0].Rows[0]["Count"]; write-host $result; 


次に、ユーザーパラメータと拡張子.confを使用してファイルを作成する必要があります(または、以前に作成されていた場合は、既存のユーザーファイルに行を追加します)。
UserParameter = PARAMETER_NAME_NUMBERのリクエストされたリクエスト、powershell -NoProfile -ExecutionPolicy Bypass -File FULL_path \ zabbix \ conf \ userparams.d \ EXIT_FILENAME_NAME
UserParameter =保留中のリクエストのPARAMETER_NAME_NUMBER、powershell -NoProfile -ExecutionPolicy Bypass -File FULL_Path \ zabbix \ conf \ userparams.d \ WAITING_FILTER_NAME前
その後、.confファイルを保存し、Zabbixエージェントを再起動します。
その後、2つの要素をZabbix newに追加します(この場合、名前とキーは一致します)。
TITLE_NAME_NUMBER_ OF QUESTIONS REQUESTED
TITLE_NAME_NUMBER_ OF EXPEDED REQUESTS
作成したカスタムデータ要素のグラフとトリガーを作成できるようになりました。

保留中のリクエストの数が急激に増加した場合、次のリクエストは、現在実行中および保留中のすべてのリクエストを、リクエストの実行場所およびログインの詳細、リクエストのテキストおよび計画、その他の詳細とともに表示できます。
コード
 /*,      ,   ,     */ with tbl0 as ( select ES.[session_id] ,ER.[blocking_session_id] ,ER.[request_id] ,ER.[start_time] ,ER.[status] ,ES.[status] as [status_session] ,ER.[command] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[database_id], ES.[database_id])) as [DBName] ,(select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle])) as [TSQL] ,(select top(1) [objectid] from sys.dm_exec_sql_text(ER.[sql_handle])) as [objectid] ,(select top(1) [query_plan] from sys.dm_exec_query_plan(ER.[plan_handle])) as [QueryPlan] ,ER.[wait_type] ,ES.[login_time] ,ES.[host_name] ,ES.[program_name] ,ER.[wait_time] ,ER.[last_wait_type] ,ER.[wait_resource] ,ER.[open_transaction_count] ,ER.[open_resultset_count] ,ER.[transaction_id] ,ER.[context_info] ,ER.[estimated_completion_time] ,ER.[cpu_time] ,ER.[total_elapsed_time] ,ER.[scheduler_id] ,ER.[task_address] ,ER.[reads] ,ER.[writes] ,ER.[logical_reads] ,ER.[text_size] ,ER.[language] ,ER.[date_format] ,ER.[date_first] ,ER.[quoted_identifier] ,ER.[arithabort] ,ER.[ansi_null_dflt_on] ,ER.[ansi_defaults] ,ER.[ansi_warnings] ,ER.[ansi_padding] ,ER.[ansi_nulls] ,ER.[concat_null_yields_null] ,ER.[transaction_isolation_level] ,ER.[lock_timeout] ,ER.[deadlock_priority] ,ER.[row_count] ,ER.[prev_error] ,ER.[nest_level] ,ER.[granted_query_memory] ,ER.[executing_managed_code] ,ER.[group_id] ,ER.[query_hash] ,ER.[query_plan_hash] ,EC.[most_recent_session_id] ,EC.[connect_time] ,EC.[net_transport] ,EC.[protocol_type] ,EC.[protocol_version] ,EC.[endpoint_id] ,EC.[encrypt_option] ,EC.[auth_scheme] ,EC.[node_affinity] ,EC.[num_reads] ,EC.[num_writes] ,EC.[last_read] ,EC.[last_write] ,EC.[net_packet_size] ,EC.[client_net_address] ,EC.[client_tcp_port] ,EC.[local_net_address] ,EC.[local_tcp_port] ,EC.[parent_connection_id] ,EC.[most_recent_sql_handle] ,ES.[host_process_id] ,ES.[client_version] ,ES.[client_interface_name] ,ES.[security_id] ,ES.[login_name] ,ES.[nt_domain] ,ES.[nt_user_name] ,ES.[memory_usage] ,ES.[total_scheduled_time] ,ES.[last_request_start_time] ,ES.[last_request_end_time] ,ES.[is_user_process] ,ES.[original_security_id] ,ES.[original_login_name] ,ES.[last_successful_logon] ,ES.[last_unsuccessful_logon] ,ES.[unsuccessful_logons] ,ES.[authenticating_database_id] ,ER.[sql_handle] ,ER.[statement_start_offset] ,ER.[statement_end_offset] ,ER.[plan_handle] ,ER.[dop] ,coalesce(ER.[database_id], ES.[database_id]) as [database_id] ,ER.[user_id] ,ER.[connection_id] from sys.dm_exec_requests ER with(readuncommitted) right join sys.dm_exec_sessions ES with(readuncommitted) on ES.session_id = ER.session_id left join sys.dm_exec_connections EC with(readuncommitted) on EC.session_id = ES.session_id ) , tbl as ( select [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[status_session] ,[command] ,[percent_complete] ,[DBName] ,OBJECT_name([objectid], [database_id]) as [object] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[dop] ,[database_id] ,[user_id] ,[connection_id] from tbl0 where [status] in ('suspended', 'running', 'runnable') ) , tbl_group as ( select [blocking_session_id] from tbl where [blocking_session_id]<>0 group by [blocking_session_id] ) , tbl_res_rec as ( select [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[status_session] ,[command] ,[percent_complete] ,[DBName] ,[object] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[dop] ,[database_id] ,[user_id] ,[connection_id] , 0 as [is_blocking_other_session] from tbl union all select tbl0.[session_id] ,tbl0.[blocking_session_id] ,tbl0.[request_id] ,tbl0.[start_time] ,tbl0.[status] ,tbl0.[status_session] ,tbl0.[command] ,tbl0.[percent_complete] ,tbl0.[DBName] ,OBJECT_name(tbl0.[objectid], tbl0.[database_id]) as [object] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_time] ,tbl0.[host_name] ,tbl0.[program_name] ,tbl0.[wait_time] ,tbl0.[last_wait_type] ,tbl0.[wait_resource] ,tbl0.[open_transaction_count] ,tbl0.[open_resultset_count] ,tbl0.[transaction_id] ,tbl0.[context_info] ,tbl0.[estimated_completion_time] ,tbl0.[cpu_time] ,tbl0.[total_elapsed_time] ,tbl0.[scheduler_id] ,tbl0.[task_address] ,tbl0.[reads] ,tbl0.[writes] ,tbl0.[logical_reads] ,tbl0.[text_size] ,tbl0.[language] ,tbl0.[date_format] ,tbl0.[date_first] ,tbl0.[quoted_identifier] ,tbl0.[arithabort] ,tbl0.[ansi_null_dflt_on] ,tbl0.[ansi_defaults] ,tbl0.[ansi_warnings] ,tbl0.[ansi_padding] ,tbl0.[ansi_nulls] ,tbl0.[concat_null_yields_null] ,tbl0.[transaction_isolation_level] ,tbl0.[lock_timeout] ,tbl0.[deadlock_priority] ,tbl0.[row_count] ,tbl0.[prev_error] ,tbl0.[nest_level] ,tbl0.[granted_query_memory] ,tbl0.[executing_managed_code] ,tbl0.[group_id] ,tbl0.[query_hash] ,tbl0.[query_plan_hash] ,tbl0.[most_recent_session_id] ,tbl0.[connect_time] ,tbl0.[net_transport] ,tbl0.[protocol_type] ,tbl0.[protocol_version] ,tbl0.[endpoint_id] ,tbl0.[encrypt_option] ,tbl0.[auth_scheme] ,tbl0.[node_affinity] ,tbl0.[num_reads] ,tbl0.[num_writes] ,tbl0.[last_read] ,tbl0.[last_write] ,tbl0.[net_packet_size] ,tbl0.[client_net_address] ,tbl0.[client_tcp_port] ,tbl0.[local_net_address] ,tbl0.[local_tcp_port] ,tbl0.[parent_connection_id] ,tbl0.[most_recent_sql_handle] ,tbl0.[host_process_id] ,tbl0.[client_version] ,tbl0.[client_interface_name] ,tbl0.[security_id] ,tbl0.[login_name] ,tbl0.[nt_domain] ,tbl0.[nt_user_name] ,tbl0.[memory_usage] ,tbl0.[total_scheduled_time] ,tbl0.[last_request_start_time] ,tbl0.[last_request_end_time] ,tbl0.[is_user_process] ,tbl0.[original_security_id] ,tbl0.[original_login_name] ,tbl0.[last_successful_logon] ,tbl0.[last_unsuccessful_logon] ,tbl0.[unsuccessful_logons] ,tbl0.[authenticating_database_id] ,tbl0.[sql_handle] ,tbl0.[statement_start_offset] ,tbl0.[statement_end_offset] ,tbl0.[plan_handle] ,tbl0.[dop] ,tbl0.[database_id] ,tbl0.[user_id] ,tbl0.[connection_id] , 1 as [is_blocking_other_session] from tbl_group as tg inner join tbl0 on tg.blocking_session_id=tbl0.session_id ) ,tbl_res_rec_g as ( select [plan_handle], [sql_handle], cast([start_time] as date) as [start_time] from tbl_res_rec group by [plan_handle], [sql_handle], cast([start_time] as date) ) ,tbl_rec_stat_g as ( select qs.[plan_handle] ,qs.[sql_handle] --,cast(qs.[last_execution_time] as date) as [last_execution_time] ,min(qs.[creation_time]) as [creation_time] ,max(qs.[execution_count]) as [execution_count] ,max(qs.[total_worker_time]) as [total_worker_time] ,min(qs.[last_worker_time]) as [min_last_worker_time] ,max(qs.[last_worker_time]) as [max_last_worker_time] ,min(qs.[min_worker_time]) as [min_worker_time] ,max(qs.[max_worker_time]) as [max_worker_time] ,max(qs.[total_physical_reads]) as [total_physical_reads] ,min(qs.[last_physical_reads]) as [min_last_physical_reads] ,max(qs.[last_physical_reads]) as [max_last_physical_reads] ,min(qs.[min_physical_reads]) as [min_physical_reads] ,max(qs.[max_physical_reads]) as [max_physical_reads] ,max(qs.[total_logical_writes]) as [total_logical_writes] ,min(qs.[last_logical_writes]) as [min_last_logical_writes] ,max(qs.[last_logical_writes]) as [max_last_logical_writes] ,min(qs.[min_logical_writes]) as [min_logical_writes] ,max(qs.[max_logical_writes]) as [max_logical_writes] ,max(qs.[total_logical_reads]) as [total_logical_reads] ,min(qs.[last_logical_reads]) as [min_last_logical_reads] ,max(qs.[last_logical_reads]) as [max_last_logical_reads] ,min(qs.[min_logical_reads]) as [min_logical_reads] ,max(qs.[max_logical_reads]) as [max_logical_reads] ,max(qs.[total_clr_time]) as [total_clr_time] ,min(qs.[last_clr_time]) as [min_last_clr_time] ,max(qs.[last_clr_time]) as [max_last_clr_time] ,min(qs.[min_clr_time]) as [min_clr_time] ,max(qs.[max_clr_time]) as [max_clr_time] ,max(qs.[total_elapsed_time]) as [total_elapsed_time] ,min(qs.[last_elapsed_time]) as [min_last_elapsed_time] ,max(qs.[last_elapsed_time]) as [max_last_elapsed_time] ,min(qs.[min_elapsed_time]) as [min_elapsed_time] ,max(qs.[max_elapsed_time]) as [max_elapsed_time] ,max(qs.[total_rows]) as [total_rows] ,min(qs.[last_rows]) as [min_last_rows] ,max(qs.[last_rows]) as [max_last_rows] ,min(qs.[min_rows]) as [min_rows] ,max(qs.[max_rows]) as [max_rows] ,max(qs.[total_dop]) as [total_dop] ,min(qs.[last_dop]) as [min_last_dop] ,max(qs.[last_dop]) as [max_last_dop] ,min(qs.[min_dop]) as [min_dop] ,max(qs.[max_dop]) as [max_dop] ,max(qs.[total_grant_kb]) as [total_grant_kb] ,min(qs.[last_grant_kb]) as [min_last_grant_kb] ,max(qs.[last_grant_kb]) as [max_last_grant_kb] ,min(qs.[min_grant_kb]) as [min_grant_kb] ,max(qs.[max_grant_kb]) as [max_grant_kb] ,max(qs.[total_used_grant_kb]) as [total_used_grant_kb] ,min(qs.[last_used_grant_kb]) as [min_last_used_grant_kb] ,max(qs.[last_used_grant_kb]) as [max_last_used_grant_kb] ,min(qs.[min_used_grant_kb]) as [min_used_grant_kb] ,max(qs.[max_used_grant_kb]) as [max_used_grant_kb] ,max(qs.[total_ideal_grant_kb]) as [total_ideal_grant_kb] ,min(qs.[last_ideal_grant_kb]) as [min_last_ideal_grant_kb] ,max(qs.[last_ideal_grant_kb]) as [max_last_ideal_grant_kb] ,min(qs.[min_ideal_grant_kb]) as [min_ideal_grant_kb] ,max(qs.[max_ideal_grant_kb]) as [max_ideal_grant_kb] ,max(qs.[total_reserved_threads]) as [total_reserved_threads] ,min(qs.[last_reserved_threads]) as [min_last_reserved_threads] ,max(qs.[last_reserved_threads]) as [max_last_reserved_threads] ,min(qs.[min_reserved_threads]) as [min_reserved_threads] ,max(qs.[max_reserved_threads]) as [max_reserved_threads] ,max(qs.[total_used_threads]) as [total_used_threads] ,min(qs.[last_used_threads]) as [min_last_used_threads] ,max(qs.[last_used_threads]) as [max_last_used_threads] ,min(qs.[min_used_threads]) as [min_used_threads] ,max(qs.[max_used_threads]) as [max_used_threads] from tbl_res_rec_g as t inner join sys.dm_exec_query_stats as qs with(readuncommitted) on t.[plan_handle]=qs.[plan_handle] and t.[sql_handle]=qs.[sql_handle] and t.[start_time]=cast(qs.[last_execution_time] as date) group by qs.[plan_handle] ,qs.[sql_handle] --,qs.[last_execution_time] ) select t.[session_id] -- ,t.[blocking_session_id] --,     [session_id] ,t.[request_id] -- .     ,t.[start_time] --    ,DateDiff(second, t.[start_time], GetDate()) as [date_diffSec] --         ,t.[status] --  ,t.[status_session] --  ,t.[command] --      , COALESCE( CAST(NULLIF(t.[total_elapsed_time] / 1000, 0) as BIGINT) ,CASE WHEN (t.[status_session] <> 'running' and isnull(t.[status], '') <> 'running') THEN DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000')) END ) as [total_time, sec] --      , CAST(NULLIF((CAST(t.[total_elapsed_time] as BIGINT) - CAST(t.[wait_time] AS BIGINT)) / 1000, 0 ) as bigint) as [work_time, sec] --         , CASE WHEN (t.[status_session] <> 'running' AND ISNULL(t.[status],'') <> 'running') THEN DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000')) END as [sleep_time, sec] --    , NULLIF( CAST((t.[logical_reads] + t.[writes]) * 8 / 1024 as numeric(38,2)), 0) as [IO, MB] --      , CASE t.transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommited' WHEN 2 THEN 'ReadCommited' WHEN 3 THEN 'Repetable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END as [transaction_isolation_level_desc] --   () ,t.[percent_complete] --      ,t.[DBName] -- ,t.[object] -- , SUBSTRING( t.[TSQL] , t.[statement_start_offset]/2+1 , ( CASE WHEN ((t.[statement_start_offset]<0) OR (t.[statement_end_offset]<0)) THEN DATALENGTH (t.[TSQL]) ELSE t.[statement_end_offset] END - t.[statement_start_offset] )/2 +1 ) as [CURRENT_REQUEST] --     ,t.[TSQL] --   ,t.[QueryPlan] --   ,t.[wait_type] --     ,      (sys.dm_os_wait_stats) ,t.[login_time] --   ,t.[host_name] --   ,   .       NULL ,t.[program_name] --  ,   .       NULL ,cast(t.[wait_time]/1000 as decimal(18,3)) as [wait_timeSec] --     ,       ( ) ,t.[wait_time] --     ,       ( ) ,t.[last_wait_type] --    ,       ,t.[wait_resource] --     ,    ,     ,t.[open_transaction_count] -- ,     ,t.[open_resultset_count] --  ,     ,t.[transaction_id] -- ,     ,t.[context_info] -- CONTEXT_INFO  ,cast(t.[estimated_completion_time]/1000 as decimal(18,3)) as [estimated_completion_timeSec] --   .    NULL ,t.[estimated_completion_time] --   .    NULL ,cast(t.[cpu_time]/1000 as decimal(18,3)) as [cpu_timeSec] --  ( ),     ,t.[cpu_time] --  ( ),     ,cast(t.[total_elapsed_time]/1000 as decimal(18,3)) as [total_elapsed_timeSec] -- ,      ( ) ,t.[total_elapsed_time] -- ,      ( ) ,t.[scheduler_id] -- ,     ,t.[task_address] --  ,   ,     ,t.[reads] --  ,    ,t.[writes] --  ,    ,t.[logical_reads] --   ,    ,t.[text_size] --  TEXTSIZE    ,t.[language] --     ,t.[date_format] --  DATEFORMAT    ,t.[date_first] --  DATEFIRST    ,t.[quoted_identifier] --1 =  QUOTED_IDENTIFIER    (ON).    — 0 ,t.[arithabort] --1 =  ARITHABORT    (ON).    — 0 ,t.[ansi_null_dflt_on] --1 =  ANSI_NULL_DFLT_ON    (ON).    — 0 ,t.[ansi_defaults] --1 =  ANSI_DEFAULTS    (ON).    — 0 ,t.[ansi_warnings] --1 =  ANSI_WARNINGS    (ON).    — 0 ,t.[ansi_padding] --1 =  ANSI_PADDING    (ON) ,t.[ansi_nulls] --1 =  ANSI_NULLS    (ON).    — 0 ,t.[concat_null_yields_null] --1 =  CONCAT_NULL_YIELDS_NULL    (ON).    — 0 ,t.[transaction_isolation_level] -- ,        ,cast(t.[lock_timeout]/1000 as decimal(18,3)) as [lock_timeoutSec] --      ( ) ,t.[lock_timeout] --      ( ) ,t.[deadlock_priority] --  DEADLOCK_PRIORITY    ,t.[row_count] -- ,      ,t.[prev_error] -- ,     ,t.[nest_level] --   ,     ,t.[granted_query_memory] -- ,      (1 -  8 ) ,t.[executing_managed_code] --,           CLR (, ,   ). --      ,    CLR   ,       Transact-SQL ,t.[group_id] --   ,     ,t.[query_hash] -- -           . --          ,       ,t.[query_plan_hash] -- -             . --              ,t.[most_recent_session_id] --      ,     ,t.[connect_time] --    ,t.[net_transport] --    ,    ,t.[protocol_type] --      ,t.[protocol_version] --    ,     ,t.[endpoint_id] --,   .   endpoint_id       sys.endpoints ,t.[encrypt_option] -- , ,       ,t.[auth_scheme] --    (SQL Server  Windows),     ,t.[node_affinity] --  ,     ,t.[num_reads] -- ,     ,t.[num_writes] -- ,     ,t.[last_read] --       ,t.[last_write] --       ,t.[net_packet_size] --  ,     ,t.[client_net_address] --    ,t.[client_tcp_port] --    ,      ,t.[local_net_address] --IP- ,     .    ,        TCP ,t.[local_tcp_port] --TCP- ,     TCP ,t.[parent_connection_id] --  ,    MARS ,t.[most_recent_sql_handle] --   SQL,     .      most_recent_sql_handle   most_recent_session_id ,t.[host_process_id] --   ,   .       NULL ,t.[client_version] -- TDS- ,       .       NULL ,t.[client_interface_name] --   ,       .       NULL ,t.[security_id] --  Microsoft Windows,     ,t.[login_name] --SQL Server  ,     . --    ,      , .  original_login_name. --  SQL Server        ,    Windows ,t.[nt_domain] -- Windows  ,        Windows   . --    ,    ,    NULL ,t.[nt_user_name] --  Windows  ,        Windows   . --    ,    ,    NULL ,t.[memory_usage] -- 8-  ,    ,t.[total_scheduled_time] -- ,    (   )  ,   ,t.[last_request_start_time] --,      .    ,     ,t.[last_request_end_time] --        ,t.[is_user_process] --0,    .      1 ,t.[original_security_id] --Microsoft   Windows,    original_login_name ,t.[original_login_name] --SQL Server  ,      . --     SQL Server,   ,    Windows, --  ,     . -- ,               . --  EXECUTE AS  ,t.[last_successful_logon] --        original_login_name     ,t.[last_unsuccessful_logon] --        original_login_name     ,t.[unsuccessful_logons] --        original_login_name   last_successful_logon   login_time ,t.[authenticating_database_id] --  ,    . --       0. --             ,t.[sql_handle] ---  SQL- ,t.[statement_start_offset] --          ,     . --       sql_handle, statement_end_offset  sys.dm_exec_sql_text --         ,t.[statement_end_offset] --          ,     . --       sql_handle, statement_end_offset  sys.dm_exec_sql_text --         ,t.[plan_handle] ---   SQL ,t.[database_id] --  ,     ,t.[user_id] -- ,    ,t.[connection_id] -- ,     ,t.[is_blocking_other_session] --1-    , 0-      ,coalesce(t.[dop], mg.[dop]) as [dop] --   ,mg.[request_time] --        ,mg.[grant_time] --  ,     .   NULL,       ,mg.[requested_memory_kb] --      ,mg.[granted_memory_kb] --      . --   NULL,      . --       requested_memory_kb. --          , --        ,mg.[required_memory_kb] --     (),     . -- requested_memory_kb       ,mg.[used_memory_kb] --       ( ) ,mg.[max_used_memory_kb] --          ,mg.[query_cost] --   ,mg.[timeout_sec] --             ,mg.[resource_semaphore_id] --   ,     ,mg.[queue_id] --  ,       . -- NULL,     ,mg.[wait_order] --       queue_id. --      ,          . -- NULL,     ,mg.[is_next_candidate] --      (1 = , 0 = , NULL =   ) ,mg.[wait_time_ms] --   .  NULL,     ,mg.[pool_id] --  ,        ,mg.[is_small] -- 1 ,          . -- 0     ,mg.[ideal_memory_kb] --,   (),  ,        . --     ,mg.[reserved_worker_count] --  ,     ,      ,    ,mg.[used_worker_count] --  ,    ,mg.[max_used_worker_count] --??? ,mg.[reserved_node_bitmap] --??? ,pl.[bucketid] --  ,    . --    0    -   . --  SQL Plans  Object Plans  -   10007  32-    40009 —  64-. --  Bound Trees  -   1009  32-    4001  64-. --      -   127  32-  64-   ,pl.[refcounts] --  ,     . -- refcounts       1,     ,pl.[usecounts] --    . --  ,       . --        showplan ,pl.[size_in_bytes] -- ,    ,pl.[memory_object_address] --   . --      sys.dm_os_memory_objects, --     , --   sys.dm_os_memory_cache_entries       ,pl.[cacheobjtype] --   .       ,pl.[objtype] -- .       ,pl.[parent_plan_handle] --  --  sys.dm_exec_query_stats   ,     (, ) ,qs.[creation_time] --   ,qs.[execution_count] --       ,qs.[total_worker_time] --  ,       ,   (    ) ,qs.[min_last_worker_time] --  ,     ,   (    ) ,qs.[max_last_worker_time] --  ,     ,   (    ) ,qs.[min_worker_time] --  , -    ,   (    ) ,qs.[max_worker_time] --  , -    ,   (    ) ,qs.[total_physical_reads] --           . --   0       ,qs.[min_last_physical_reads] --         . --   0       ,qs.[max_last_physical_reads] --         . --   0       ,qs.[min_physical_reads] --        . --   0       ,qs.[max_physical_reads] --        . --   0       ,qs.[total_logical_writes] --           . --   0       ,qs.[min_last_logical_writes] --     ,      . --    «» (. . ),    . --   0       ,qs.[max_last_logical_writes] --     ,      . --    «» (. . ),    . --   0       ,qs.[min_logical_writes] --        . --   0       ,qs.[max_logical_writes] --        . --   0       ,qs.[total_logical_reads] --           . --   0       ,qs.[min_last_logical_reads] --         . --   0       ,qs.[max_last_logical_reads] --         . --   0       ,qs.[min_logical_reads] --        . --   0       ,qs.[max_logical_reads] --        . --   0       ,qs.[total_clr_time] --,   (    ), -- Microsoft .NET Framework    (CLR)        . --  CLR    , , ,     ,qs.[min_last_clr_time] -- ,   (    ), --  .NET Framework   CLR     . --  CLR    , , ,     ,qs.[max_last_clr_time] -- ,   (    ), --  .NET Framework   CLR     . --  CLR    , , ,     ,qs.[min_clr_time] -- , -       .NET Framework  CLR, --  (    ). --  CLR    , , ,     ,qs.[max_clr_time] -- , -       CLR .NET Framework, --  (    ). --  CLR    , , ,     --,qs.[total_elapsed_time] -- ,    ,   (    ) ,qs.[min_last_elapsed_time] -- ,     ,   (    ) ,qs.[max_last_elapsed_time] -- ,     ,   (    ) ,qs.[min_elapsed_time] -- , -    ,   (    ) ,qs.[max_elapsed_time] -- , -    ,   (    ) ,qs.[total_rows] --  ,  .     null. --   0,             ,qs.[min_last_rows] --  ,    .     null. --   0,             ,qs.[max_last_rows] --  ,    .     null. --   0,             ,qs.[min_rows] --  , -        --   0,             ,qs.[max_rows] --  , -        --   0,             ,qs.[total_dop] --          . --    0    ,    ,qs.[min_last_dop] --  ,     . --    0    ,    ,qs.[max_last_dop] --  ,     . --    0    ,    ,qs.[min_dop] --     -     . --    0    ,    ,qs.[max_dop] --     -     . --    0    ,    ,qs.[total_grant_kb] --        ,     . --    0    ,    ,qs.[min_last_grant_kb] --      ,     . --    0    ,    ,qs.[max_last_grant_kb] --      ,     . --    0    ,    ,qs.[min_grant_kb] --              . --    0    ,    ,qs.[max_grant_kb] --              . --    0    ,    ,qs.[total_used_grant_kb] --        ,     . --    0    ,    ,qs.[min_last_used_grant_kb] --      ,     . --    0    ,    ,qs.[max_last_used_grant_kb] --      ,     . --    0    ,    ,qs.[min_used_grant_kb] --             . --    0    ,    ,qs.[max_used_grant_kb] --             . --    0    ,    ,qs.[total_ideal_grant_kb] --     ,      . --    0    ,    ,qs.[min_last_ideal_grant_kb] --  ,    ,     . --    0    ,    ,qs.[max_last_ideal_grant_kb] --  ,    ,     . --    0    ,    ,qs.[min_ideal_grant_kb] --        -      . --    0    ,    ,qs.[max_ideal_grant_kb] --        -      . --    0    ,    ,qs.[total_reserved_threads] --        -     . --    0    ,    ,qs.[min_last_reserved_threads] --    ,     . --    0    ,    ,qs.[max_last_reserved_threads] --    ,     . --    0    ,    ,qs.[min_reserved_threads] --    , -     . --    0    ,    ,qs.[max_reserved_threads] --           . --    0    ,    ,qs.[total_used_threads] --       -     . --    0    ,    ,qs.[min_last_used_threads] --    ,     . --    0    ,    ,qs.[max_last_used_threads] --    ,     . --    0    ,    ,qs.[min_used_threads] --    ,     . --    0    ,    ,qs.[max_used_threads] --    ,     . --    0    ,    from tbl_res_rec as t left outer join sys.dm_exec_query_memory_grants as mg on t.[plan_handle]=mg.[plan_handle] and t.[sql_handle]=mg.[sql_handle] left outer join sys.dm_exec_cached_plans as pl on t.[plan_handle]=pl.[plan_handle] left outer join tbl_rec_stat_g as qs on t.[plan_handle]=qs.[plan_handle] and t.[sql_handle]=qs.[sql_handle] --and qs.[last_execution_time]=cast(t.[start_time] as date); 


また、収集された統計によると、最も難しいクエリを取得できることを思い出させてください。
コード
 /* creation_time - ,    .      ,         .  ,     ,   (  ),    ,         . last_execution_time -     . execution_count -                -       ,    -          . ,  -    ,    . CPU -      .    ,         ,       .          ,      - . ,      ,    . AvgCPUTime -      . TotDuration -    ,  .         , ,     " ".         CPU (   ) -    ,       - .          ,          .          sys.dm_os_wait_stats. AvgDur -      . Reads -   .     ,      .   -      ,    .     ,          .     ,     ,  ,      ,       . Writes -     .  ,   ""    .  ,       0     ,    ,     ,      tempdb. AggIO -     - ()  ,         ,            . AvgIO -         .        :    -  8192 .      , ""  .       ,    (       ),    ,             .   ,      ,    5,          300,     ,      10.          -         .          ,            .  ,          ,           ,         ,           . ,          -             .    ...   ,    ,        .   -       .  ,    ,       .               . query_text -    database_name -   ,   ,  . NULL    object_name -   (  ),  . */ with s as ( select creation_time, last_execution_time, execution_count, total_worker_time/1000 as CPU, convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime], qs.total_elapsed_time/1000 as TotDuration, convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur], total_logical_reads as [Reads], total_logical_writes as [Writes], total_logical_reads+total_logical_writes as [AggIO], convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO], [sql_handle], plan_handle, statement_start_offset, statement_end_offset from sys.dm_exec_query_stats as qs with(readuncommitted) where convert(money, (qs.total_elapsed_time))/(execution_count*1000)>=100 --    100  ) select s.creation_time, s.last_execution_time, s.execution_count, s.CPU, s.[AvgCPUTime], s.TotDuration, s.[AvgDur], s.[Reads], s.[Writes], s.[AggIO], s.[AvgIO], --st.text as query_text, case when sql_handle IS NULL then ' ' else(substring(st.text,(s.statement_start_offset+2)/2,( case when s.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2 else s.statement_end_offset end - s.statement_start_offset)/2 )) end as query_text, db_name(st.dbid) as database_name, object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as [object_name], sp.[query_plan], s.[sql_handle], s.plan_handle from s cross apply sys.dm_exec_sql_text(s.[sql_handle]) as st cross apply sys.dm_exec_query_plan(s.[plan_handle]) as sp 


MySQL用に作成することもできます。これを行うには、mysql-connector-netインストールして、次のように記述します。
保留中のリクエストのコード
 #     MySQL    [string]$sMySQLUserName = 'UserName' [string]$sMySQLPW = 'UserPassword' [string]$sMySQLDB = 'db' [string]$sMySQLHost = 'IP-address' [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data"); [string]$sConnectionString = "server="+$sMySQLHost+";port=3306;uid=" + $sMySQLUserName + ";pwd="+"'" + $sMySQLPW +"'"+ ";database="+$sMySQLDB; #Open a Database connection $oConnection = New-Object MySql.Data.MySqlClient.MySqlConnection($sConnectionString) $Error.Clear() try { $oConnection.Open() } catch { write-warning ("Could not open a connection to Database $sMySQLDB on Host $sMySQLHost. Error: "+$Error[0].ToString()) } #The first query # Get an instance of all objects need for a SELECT query. The Command object $oMYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand; # DataAdapter Object $oMYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter; # And the DataSet Object $oMYSQLDataSet = New-Object System.Data.DataSet; # Assign the established MySQL connection $oMYSQLCommand.Connection=$oConnection; # Define a SELECT query $oMYSQLCommand.CommandText='query'; $oMYSQLDataAdapter.SelectCommand=$oMYSQLCommand; # Execute the query $count=$oMYSQLDataAdapter.Fill($oMYSQLDataSet, "data"); $result = $oMYSQLDataSet.Tables[0].Rows[0]["Count"]; write-host $result; 


結果



この記事では、Zabbixのパフォーマンスカウンター(データ要素)の例を見てきました。このアプローチにより、さまざまな問題をリアルタイムで、または特定の時間後に管理者に通知できます。したがって、このアプローチにより、重大な問題の発生を最小限に抑え、DBMSとサーバーの動作を停止することができます。これにより、生産プロセスが作業プロセスを停止するのを防ぎます。
前の記事MS SQL Serverの24時間365日の情報システムデータベースを使用したメンテナンス作業

ソース:


Zabbixの3.4の
パフォーマンスカウンタは、
データベースSQL AzureのデータセンターのパフォーマンスとデータベースエンジンサーバーSQL
» ライフスタイルSQL
SQLSkills
TechNetのマイクロソフト
メモリ使用量を分析し
、』パフォーマンス分析
SQLのマニュアル
Windows上での注意事項

Source: https://habr.com/ru/post/J338498/


All Articles