web-dev-qa-db-ja.com

SQL Serverプロファイラーを使用して単一のテーブルのアクティビティを監視する方法

一意のID列にIDシードを使用するテーブルがあります。説明できないアイデンティティ値の大幅なジャンプに気づきました。テーブルには20,000の奇数行があり、最大のID値は560,000,000を超え、IDの増分は値1です。

SQL Serverプロファイラーを使用してそのテーブルのアクティビティを監視したいと思ったので、IDが大きな問題に飛び込んでいる原因を確認できましたが、モニターを見るとすぐに混乱しました。私はラッシュにいることを認めており、これがどのように機能するかを本当に学ぶ時間がないので(私が望むだけ)、テーブルのアクティビティを監視するために実行する必要がある手順について大まかなガイドを使用できます。

どんな助けでも本当にいただければ幸いです。

7
user22785

SQLプロファイラを起動し、新しいトレースを作成して、監視するSQL Serverに接続します。

注意:これが非常にビジーな本番サーバーである場合、SQL Serverの速度が低下するため、SQLプロファイラーを使用しないでください

私は通常、「標準」プロファイルを使用して、それを編集します。

「イベント選択」タブをクリックします。私は通常、「監査ログイン」、「監査ログアウト」、「ExistingConnections」、「RPCバッチ開始」のチェックを外します。これにより、Nice clean trace出力が得られます。

「TextData」がチェックされていることを確認してください。

TextData列の「LIKE %%」のトレースにフィルターを追加できますが、これにはサーバーに直接送信されたSQLステートメントのみが含まれます。ストアドプロシージャがある場合、どのストアドプロシージャがテーブルにアクセスし、それらをフィルタリングするかを知る必要があります。

カーソルクエリを実行すると、 "sp_fetch"が大量に発生します。同じカーソルIDでDECLARE CURSORステートメントを検索する必要があります。

考えてみると、不適切なcursor-forループはすぐに何千もの「エラー」レコードを挿入する可能性があり、それがこれらの大きな増分ジャンプの原因である可能性があります。

4
Guy

ID値は、挿入が失敗した場合でも、挿入ごとに増加します。

チェックまたは外部キー制約がある場合、失敗するたびにIDが増加します。 「値が大きすぎる」場合、挿入は失敗しますが、IDは増加します。

通常、これは問題ではありません。識別フィールドの目的は、その行に一意の参照を提供することであり、番号が欠落することなく適切にインクリメントされることは、人間が「きちんと保つ」ことであり、データベースが混乱することではありません。

より差し迫った問題は、挿入が失敗し、それについて知らない理由です...

1
Guy

SQL Serverは、サービスの停止と開始でID列をリセットしています。誰かがそれをバグだと思った接続項目がありますが、MSのものはこれがNiceデザイン機能です。 https://connect.Microsoft.com/SQLServer/feedback/details/739013/alwayson-fail

IDを再シードする動作をオフにするトレースフラグがあり、起動フラグとして-T272が役立ちます。

0