本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「実行プランの重要性」を解説します。
本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブルについて、「なぜ起こったか」の理由とともに具体的な対処方法を紹介していきます。
前回は、SQL Serverの実行プランを作成するのに必要となる「統計情報」の基礎を解説しました。今回は、その「実行プラン」の運用方法を解説します。
「統計情報」が実際に利用されるのは、「実行プラン」の生成時です。
実行プランとは、SQL Serverが内部で利用するクエリの実行計画書のことです。SQL Serverは実行プランに従って、内部でデータ抽出、ソート、結合、フィルタリングなどの処理を行います。つまり、「動作のキモ」です。この実行プランを正しく理解し、正しく運用することで、パフォーマンス問題の解決能力が「一気に向上する」と言えます。
SQL Serverが「クエリを受け取り、実際に実行するまで」の流れは以下の通りです(図1)。
SQL Serverは、発行されたクエリを最終的に「実行プランに変換」します。その処理をコンパイルと呼びます。プログラムにおけるコンパイルと同じように、そのままではただのテキストデータを、実行エンジンであるSQL Serverが受け取れる形に変更する処理を行う行程となります。
クエリの実行に当たり、まずは「プロシージャキャッシュ」を確認します。プロシージャキャッシュは作成された実行プランを格納しておく、メモリ上の領域のことです。キャッシュに使い回せる実行プランが既に存在するならば、コンパイル処理を飛ばしてクエリを実行できます。
一方、プロシージャキャッシュに該当する実行プランがなかった場合は、コンパイル処理を行って実行プランを新たに作成します。コンパイルは「文法解析」「定義解析」「最適化」の3つのフェーズがあります。
文法解析では「T-SQLとして文法が正しいか」を、定義解析では「指定されたテーブルが存在するか、列が存在するかといった情報の整合性」を確認します。その後、統計情報を基にして最適化します。
この最適化処理では、データの読み出し方や結合、ソートの有無など、さまざまな処理の組み合わせの中からよいものが選ばれます。ここでのポイントは、「限られた時間の中で見つかった実行プランから、最もコストの少ないものを選ぶ」という条件があることです。時間を無限に使ってよいならば、莫大な数の実行プラン候補の中から絞り込んで、例えば「1秒以内で実行が終わる、最もよいもの」がみつかるかもしれません。しかし、それを探すのに1時間もかかってしまうのでは、意味がありません。作成された実行プランは「最も速いものである“とは限らない”」。ここを理解しておくことが、パフォーマンス問題を改善につなげるポイントになるでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.