適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
クエリを実行するには、SQL Serverデータベース エンジン はステートメントを分析し、必要なデータにアクセスし、処理する効率的な方法を判断する必要があります。 この分析は、クエリ オプティマイザーと呼ばれているコンポーネントによって処理されます。 クエリ オプティマイザーへの入力は、クエリ、データベース スキーマ (テーブル定義やインデックスの定義)、およびデータベース統計で構成されます。 クエリ オプティマイザーは、クエリ プランまたは実行プランと呼ばれる 1 つ以上のクエリ実行プランを構築します。 クエリ オプティマイザーは、適切なクエリ プランを見つけるためにコンパイル時間とプランの最適性のバランスを取るために、一連のヒューリスティックを使用してクエリ プランを選択します。
ヒント
クエリ処理およびクエリ実行プランの詳細については、「クエリ処理アーキテクチャ ガイド」の「SELECT ステートメントの最適化」と「実行プランキャッシュと再利用」のセクションを参照してください。
SQL Server Management Studio と Azure Data Studio での実行プランの表示については、「実行プランの表示と保存」を参照してください。
クエリ実行プランは、次の事項を定義しています。
基になるテーブルにアクセスする順序。
通常、データベース サーバーからベース テーブルにアクセスして結果セットを構築する順序は何とおりもあります。 たとえば、
SELECTステートメントが 3 つのテーブルを参照している場合、データベース サーバーは最初にTableAにアクセスし、TableAのデータを使用してTableBから一致する行を抽出します。次に、TableBのデータを使用してTableCのデータを抽出することができます。 データベースがテーブルにアクセスする際に可能な順序には、次の組み合わせがあります。
TableC、TableB、TableA、または
TableB、TableA、TableC、または
TableB、TableC、TableA、または
TableC,TableA,TableB各テーブルからデータを取り出すための方法。
通常、各テーブルのデータにアクセスする方法にも何とおりかあります。 特定のキー値を持つ数行だけが必要な場合、データベース サーバーではインデックスを使用できます。 テーブル内のすべての行が必要な場合は、インデックスを無視してテーブル スキャンを実行できます。 テーブル内のすべての行が必要で、
ORDER BYで指定されたキー列のインデックスがある場合、テーブル スキャンではなくインデックス スキャンを行うと、別の結果セットが保存される可能性があります。 テーブルが小さい場合は、テーブルにどのようにアクセスするときでもテーブル スキャンが最も効率的な方法になることがあります。計算に使用される方法と、各テーブルのデータのフィルター処理、集計、並べ替えを行う方法。
テーブルのデータにアクセスするときは、データに対して計算を実行するためのさまざまな方法が存在します (スカラー値の計算など)。また、クエリ テキストで定義されているようにデータの集計や並べ替えを行ったり (
GROUP BY句やORDER BY句を使う場合など)、データをフィルター処理したり (WHERE句やHAVING句を使う場合など) するための方法も多数存在します。