web-dev-qa-db-ja.com

NOLOCKでSQL Server DMVを使用する必要がありますか

PerformanceMonitorでは追跡できないライブパフォーマンスデータと使用状況を監視しようとしています。プロダクションライブOLTPデータベースでDMVを読み取った場合の結果は何ですか?:例:sys.dm_tran_locks、sys.dm_os_waiting_tasks、sys.dm_os_performance_counters、sys.dm_exec_connections、sys.dm_io_virtual_file_stats_、sys_dm_execs_sql_等

Dmvsをクエリするとき、WITH(NOLOCK)を使用するだけですか?これでリソースの問題の多くが解決しますか? DMVにダーティリードロールバックなどがありますか。私はそれがアプリケーションテーブルに存在する可能性があることを知っています(たとえば、誰かが注文を送信してからキャンセルする場合など)。さらに、NOLOCKを使用すると、大量の環境で行、ページをロックしていないため、クエリが永久に継続する可能性が高く、 DMV TableViewに追加されましたか?

ありがとうございました、

6
user129291

プロダクションライブOLTPデータベースでDMVを読み取ることの結果は何ですか?

私の経験としてはごくわずかです。名前が示すように、DMVは基本的にはビューまたは関数(sys.dm_db_index_physical_statsなど)であり、さまざまなキャッシュやシステムテーブルから情報を取得します。 DMVは非常に軽量で、キャッシュからデータを読み取ります。それらはブロッキングを引き起こさず、非常に迅速にフェッチする必要があるデータの量に依存します。ここでのポイントは、常に実際に必要なキャッシュからのデータのみをクエリすることです。

DMVクエリでNOLOCKヒントを使用する場合がありますが、NOLOCKヒントを使用している人もいますが、率直に言って、DMVでNOLOCKヒントを使用する必要性はあまりありません。その機能はまだ同じままです。したがって、NOLOCKヒントを使用する場合、SQL Serverに対してデータを提供すると言うので、データの状態が何であるかに関係なく、私は尋ねています。変更されていてもコミットされていない可能性があるため、「ダーティ」なデータを取得します。 NOLOCKヒントは、データの読み取り中に選択クエリが共有ロックを取得することを回避します。欠点は 多数 です。

さらに、NOLOCKを使用すると、行、ページをロックしていないため、大量の環境でクエリが永遠に継続する可能性が高くなり、DMV TableViewに引き続き追加されますか?

クエリは、終了しないループを実行しない限り、タスクが完了するまで継続します。 NOLOCKは、クエリが最小限にブロックされることを保証するだけです。また、NOLOCKを使用する場合、必要に応じてスキーマの安定性などの他のロックが取得されることにも注意してください。

1
Shanky