リレーショナルデータベースは、基盤となるハードウェア資源に大きく依存して、サーバのCPUは、高いCPUのオーバーヘッド、メモリ、およびハードディスクシステムが必要な圧力を生成する必要がないとき、脳です。CPUのパフォーマンスの問題、ビューの直感的なポイントは、ツールはCPUの圧力を検出する一方で、CPU使用率が100%で常に確認するために、タスクマネージャで、最も正確なパフォーマンスモニタです。
SQL Serverでは、操作の5つのカテゴリーには、非常にCPU資源があります:
- コンパイルされた実行計画は、実行計画は、実行計画を再利用するために、文の実行計画、プランキャッシュ内のSQL Serverが格納されているときに非常にCPUリソースを、です。
- 実行、重合(凝集)を算出する(ソート)ソート、ハッシュ操作参加計算を完了するためにCPUを消費する必要性を
- CPUの必要性のヘルプのIO命令実行、ディスクIOの多くは、実行するためにCPUリソースの一定量を消費します。
- 同時的照会要求、中に実行する設定オプションによって影響を受ける同時実行制御との並列処理の並列処理のコストしきい値の最大度;
- 圧縮とデータ圧縮の解凍、圧縮およびデータ圧縮の解凍には、CPUの計算を完了するために必要とされます
まず、CPUの圧力を検出するために使用パフォーマンスモニタ
パフォーマンスモニタ(パフォーマンス)は、次の3つのカウンタに焦点を当てることができ、パフォーマンスモニタを使用した場合、高いCPU使用率のために、CPUの圧力を検出することが推奨ツールです。
- プロセッサ/%特権時間:カーネルコマンドWinidowsの実行に費やしたプロセッサ時間の割合
- プロセッサ/%ユーザ時間:アプリケーションの処理に費やされたプロセッサ時間の割合
- 工程(sqlserver.exe)/%プロセッサ時間:すべてのプロセスのために各プロセッサの全処理時間
上記3つのカウンタに加えて、カウンタは、SQL統計を監視するために使用することができます。
- SQL Serverの:SQL統計/オートのParam試行/秒
- SQL Serverの:SQL統計/失敗オートのparams /秒
- SQL Serverの:SQL統計/バッチ要求/秒
- SQL Serverの:SQL統計/ SQLコンピレーション/秒
- SQL Serverの:SQL統計/ SQLの再コンピレーション/秒
- SQL Serverの:プランキャッシュ/キャッシュのヒット率
第二に、使用DMVは、CPUの圧力を検出します
DMV CPUの圧力を検出するための現在のシステムを用いて、従来の手順は次のとおりです。
- STEP1:使用sys.dm_os_wait_statsは、圧力CPUがあるかどうかを確認するために待っています
- STEP2:sys.dm_os_wait_statsのsys.dm_os_schedulersによるCPUの種類と問題点を決定する待機の種類によると、
- STEP3:プランキャッシュのCPU消費量とsys.dm_exec_query_statsによって最高のクエリを見つけるsys.dm_exec_sql_text
- STEP4:現在のタスクsys.dm_os_waiting_tasksで消費されるCPUの最高の種類のCPU待ちに関連するタスクを見つけます
- STEP5:中sys.dm_exec_requestsから最高のクエリを使用して現在のクエリのCPUリソースを見つけます。
三、CPU関連の待ち時間
CPU圧力を待ってチェックsys.dm_os_wait_statsからは、通常、関連する待機の種類である:SOS_SCHEDULER_YIELDとCXPACKET
1、CXPACKET
複数のスレッドからの問合せ場合CXPACKETは完全にクエリ全体、スレッドの最も遅いが終了した後にのみ、最も一般的な並列待ちです。これは、バレル効果並列クエリ、バケット容量が最短成る木樽の一片の長さに依存します。
マルチCPU環境では、単一のクエリは、データセットの各ねじ部を別々に、複数のスレッドを完了するために一緒に使用されてもよいです。並列処理の過程において、下位状態のスレッドは、CXPACKETは待たなければならない場合。しかし、CXPACKET待ちが常にパフォーマンスの問題システムを示していない、注意すべきです。平行閾値(並列、CTPのコスト閾値)と同時実行の最大次数(並列、MDPの最大の次数)の合理的な程度を提供テストする必要があり、これらの2つの項目を使用が配置されています。
- CTPは、クエリのコストを意味するだけ同時操作の後に一定の閾値を超え
- MDPは、CPUコアの数に設定する必要がありますどのように多くのスレッド、それはほとんど使わ同時に処理するタスクを表し、
待機の理由はCXPACKETです。
- 変数のタイプでは、深刻な傾斜は、データの一部の長さが数文字、文字の数千人の一部であり、一部につながる、このデータを照会するために、このような列nvarcharデータ型などのデータの分布が存在しますスレッドはすぐに実行されますが、別のスレッドの実行が遅いです。
- クエリデータは、これらのサブシステムとの違いのパフォーマンスながら、異なるIOサブシステムに格納する必要が
- 異なる部分の異なる部分に必要なクエリデータも異なるIOを必要としていました。IOの数は、直接速度を実行している別のスレッドで別のクエリ処理で、その結果、速度とリソース消費量に影響を与えます。
2、SOS_SCHEDULER_YIELD
SOS_SCHEDULER_YIELD待ちタイプは、サーバがマルチコア、複数のタスクを同時に処理することができたことを意味するマルチタスク、マルチタスクスケジューリングシステムに表示されます。リソースを使用している他のタスクがダウンして実行するようSOS_SCHEDULER_YIELD待機型は、現在占有リソースを放棄するタスクで発生します。
必要に応じて、SQL Serverは一般的に言えば、そのような譲歩は、このような待ちの長期的な、大規模な数字が意味するかもしれない時に、しかし、一時的なものであり、SQL Serverのに他のスレッドにリソースを作る、協力モードで実行されていますCPUは圧力が存在しない、この時間は、あなたが実行可能なタスクが実行されているどのように多くの現在見て、sys.dm_os_schedulersをチェックすることができ、
選択schedule_id、current_tasks_count、runnable_task_count、work_queue_count、pending_disk_io_count からsys.dm_os_schedulers schedule_id < 255
通常は、長い時間のための二桁の数値フィールドのrunnable_task_countの存在する場合、それは圧力CPUがあるかもしれない意味し、現在のワークロードに対応できません。
4つの理由、一般的な高CPU使用率
以下は、高いCPU使用率の7つの一般的な状況をまとめました。
1、不足しているインデックス
適切なインデックスが支持クエリに使用されていない場合には、通常は、テーブルの大面積を介してメモリへの不必要な大量のデータをロードすることにより、必要に、不必要な大量のデータを扱うためにSQL Serverにつながることができ、彼らが必要とする情報を、スキャンすることができますこれらのIO操作は、キャッシュへのプランにつながる、メモリ圧力を引き起こす可能性がCPUリソースを消費し、大量のデータがメモリにロードされているSQL Serverが実行計画を再コンパイルする必要がありますように除去して、コンパイルと実行計画にも高いCPUオーバーヘッド操作です。
2、統計情報が古くなっています
SQL Serverオプティマイザ統計と統計が不正確日、外の場合、クエリのコストを推定し、不適切な実行計画を生成するオプティマイザをリードします。
あなたは、行の数に大きな差があれば、グラフィカルな実行計画を確認し、それは統計情報が必要に更新されるように、古くなって示した行の実際の数を推定することができます。
3、非SARG問い合わせ
(上)インデックスに使用することができるクエリは、その後、式はSARG操作(インデックスシーク)はシーク場合SARGは、簡単な言葉で、検索Argumengの略語です。
列インデックス式や関数を用いた計算、または「%のSTR」のような使用及びインデックスの故障につながるように、典型的には、これらのクエリは、非SARGクエリです。
図4に示すように、暗黙的な変換
SQL Serverは、さまざまな種類のデータを一致させることはできませんので、一致させるために、同じタイプへの最初の変換する必要がありますデータ。
CONVERT_IMPLICIT事業者が計画の実際の実装に表示された場合、それは暗黙の型変換の種類ことを示しています。
5、パラメータスニッフィング
スニッフィングパラメータが渡されたパラメータに基づいて推定するストアドプロシージャまたはパラメータクエリの実行プランを作成し、実行プランを生成することを指します。生成されたSQL Serverの実行計画は、他のほとんどのパラメータながら、それは非常に非効率的である、現在のパラメータに最適です。時には、初めて渡すパラメータクエリの、オリジナルの実行計画につながる、実施計画、分布パラメータに対応したデータに問題が原因再開パラメータを、生産している効率的なクエリにすることができない応答、どのパラメータスニッフィングの問題が発生します。
パラメータスニッフィング問題について、あなたは避けるために、コンパイラプロンプト(最適化のための)および他の機能を再コンパイルするステートメントを使用することができます。
6、ノンパラメトリックアドホッククエリ
ノンパラメトリックアドホッククエリは、SQL Serverは、廃棄物のメモリとCPUリソースが得られ、シングルユースプランキャッシュの多数をキャッシュするために、ストアドプロシージャ、アドホッククエリのパラメータを使用するか、アドホックのための」最適化を有効にすることができ指し、避けるために、ワークロード「。
アドホックは、一般にクエリをパラメータ化TSQLのsp_executesqlをを使用するコードの実装を指します。
サーバー「アドホックのワークロードの最適化では、」プランキャッシュの効率を改善するためのパフォーマンスの最適化オプションのレベルは一時的なバッチ・ワークロードの数が含まれ、そしてオプションがTrueの場合、最初のバッチのコンパイルにおけるデータベースエンジンに設定されている場合計画全体ではなく、実行計画を格納する、唯一のスタブのキャッシュを保持するとき。あなたは再びバッチを呼び出すと、データベースエンジンは、バッチスタブが以前に行われて特定し、プランキャッシュから実行計画を削除し、プランキャッシュに完全にコンパイル実行計画を追加します。ノンパラメトリックアドホッククエリがあまりにも多くのキャッシュメモリの実施計画を回避するために、より計画している場合は再利用することはできません。
図7に示すように、圧縮動作
圧縮と解凍が高いCPUオーバーヘッドの操作、データ圧縮、バックアップ圧縮され、CPU使用率を増加させることにより、圧力及びIOサブシステムのディスクスペースの圧力を減らすために、ストリームの圧縮をログに記録します。データ圧縮は、IOサブシステム圧力を減少させるという利点を有する、クエリのパフォーマンスを向上させ、欠点は、CPUリソースの消費量であると、挿入、更新データに悪影響を与えます。
参照文献: