クエリプロファイリングは、SQLServerパフォーマンスのブラックボックス内で何が起こっているかを把握する方法です。
ユーザーは簡単です。 DBAはしません。
データベースアプリケーションの実行が不十分な場合にユーザーが利用できる簡単なオプションについて考えてみてください。
- コーヒーを飲みに行って待ってください。
- コンピューターを侮辱します。
- 他のユーザーに文句を言う。
- トラブルチケットを送信します。
それは、DBAとしての選択肢と比較して、ライリーの人生ではありませんか?
- ブロックされたセッションを探します。
- バッファキャッシュのヒット率を確認します。
- 最大I/O待機を測定します。
- ページの平均余命を調べます。
- インデックスが欠落していないか、再構築が必要かどうかを確認します。
- ロック/デッドロックを探します。
- CPU使用率を確認します。
- アプリケーションログでメモリ不足のメッセージを確認します。
- tempdbデータベースが正しく構成されていることを確認してください。
これらのソフトウェアの問題のいずれかである可能性があり、通常、クエリを最適化するか、構成を変更するという解決策につながります。または、ハードウェアの問題である可能性があり、解決策は、より多くのメモリまたは処理能力を購入することです。
データベースアプリケーションは主に多くのSQLクエリを実行することを目的としているため、パフォーマンスの問題にはSQLServerに隠すべき場所がたくさんあります。ユーザーの場合は、次のように言うことができます。「まあ、問題はどこかのブラックボックスの中にあるはずです。私の仕事ではありません。」
しかし、DBAとして、あなたにはそのような贅沢はありません。ブラックボックスを開いて、登り、混乱を見つけて修正する必要があります。
SQLサーバーのパフォーマンス監視を使用したクエリプロファイリング101
一般に、サーバーパフォーマンスの監視の目標は、SQLクエリが時間の経過とともにどのように実行されているかおよびSQLServerのトランザクション量の増加を監視することです。その目標はいくつかの方法で達成できます。
説明プランをご覧ください
Explainプランは、SQL Serverがクエリを実行する際に行うことを示しています。これには、結合するテーブル、実行する結合のタイプ、接触する行数、使用するインデックスが含まれます。
説明計画はあなたに何を伝えることができますか? 1つには、たとえば、データベース開発者の1人が巨大なテーブルに対して追加したNESTED LOOP JOINを削除することで、クエリ自体を改善する方法を確認できます。または、Explain Planから、特定のテーブルのインデックスを作成または再構築する必要があることを理解できます。
Explainプランは、疑わしいクエリを実際に実行する前であっても、クエリプロファイリングの開始点として適しています。
クエリを実行する
クエリを実行し、実行時にどのリソースに影響するかを確認するには、最初にトレースを作成して、発生したイベントにマークを付けます。トレースを使用すると、データをキャプチャしてエラーの発生を監視できます。プロファイリングツールは、トレースがキャプチャしたデータを保存し、問題のあるクエリを見つけてトラブルシューティングしやすい方法で表示します。
トレースとプロファイリングツールの組み合わせにより、多くの質問に答えることができます:
- どのクエリが最もメモリを消費しますか?
- 各クエリの実行にはどのくらい時間がかかりますか?
- SQL Serverはクエリごとにどのロックを設定しますか?
- SQL Serverはバッファキャッシュからどのクエリを実行できますか?どのくらいの頻度でディスクに移動する必要がありますか?
- 各クエリは何行を調べますか?
- データベースは1分あたり何件のリクエストを処理していますか?
本番データベースでクエリを実行することで最も正確な読み取りが可能になりますが、実際の顧客やユーザーによる処理が遅くなる可能性もあります。可能であれば、最初に、本番インスタンスとメモリまたはI/Oを競合していない開発インスタンスまたはテストインスタンスでテストします。
顧客とユーザーについて言えば、クエリプロファイリングの目標は彼らを幸せにすることです。プロファイリングを使用すると、データベース内の数十の問題を簡単に見つけることができますが、ブラックボックスを開いた理由は、最も困難な問題を解決するためです。通常の使用の1日か2日からデータをキャプチャした後、ユーザーに最も問題を与えるSQLサーバーのパフォーマンスの問題を見つけることができます。インデックスが欠落しているとレコードの取得が遅くなるか、インデックスが多すぎるとレコードの挿入とデータベースの更新が遅くなる可能性があります。たぶん、頻繁に使用されるクエリは、誰も気にしない情報を収集することです。
プロファイリングツールを賢く使用する
プロファイリングツールを使用すると、トレースするすべてのものに対して各イベント、フィルター、およびプロシージャコールを手動で設定するという面倒なプロセスから解放されます。 SQL Serverのパフォーマンスのブラックボックス内で多くのことが行われているため、大量のデータを簡単にキャプチャして、ツリーのフォレストを確認することができます。
優れたツールを使用すると、トレースする対象を慎重に選択できるため、たとえば、何百ものLock:Acquiredイベントをキャプチャして、ディスプレイを不必要にいっぱいにすることはありません。ただし、頻繁に発生するイベントを調べる必要がある場合は、アプリケーション名やテーブル名などのフィルターを使用してください。
データベース内のテーブルにトレースデータを書き込む代わりに、それを独自の別のファイルに保存することを検討してください。これにより、トレースのオーバーヘッドがSQL Serverの負担になり、結果が歪む可能性がなくなります。プロファイリングツールがテーブルから取得したデータを優先する場合は、後でファイルからテーブルにデータをインポートできます。
クエリプロファイリングを使用してSQLServerのパフォーマンス監視を改善する
ユーザーはSQLServerのパフォーマンスのブラックボックスから離れていますが、そうする必要はありません。クエリプロファイリングとは、ボックスを開いて内部で何が起こっているのかを把握し、トラブルシューティングを開始する方法です。
ただし、問題が発生するまで待ってはいけません。クエリプロファイリングは、エンジンを交換するというよりも、オイルをチェックするようなものです。これは、データベースがビジネスの変化に対応できるように、廃止されたクエリを更新し、設計を変更するという通常のDBAの任務に役立ちます。