質問

質問1:

クエリを実行すると、クエリを実行するたびに実行計画が変更されますか?

「はい」の場合、パフォーマンスが低下しますか?

いいえの場合、テーブル内の何かを変更すると、つまりインデックスを追加すると、データベースは、実行プランを変更して実行を高速化するために使用できるものがあることをどのように認識しますか?

QUestion 2:

しかし、特に多くの結合(外部、内部、自然、多数の外部)がある場合、結合クエリの実行中の一般的な実行順序は何ですか。

役に立ちましたか?

解決

  • 正確に SQL Server にするには:

キャッシュには最大2つのプランがあります(1つは並列、もう1つは非並列)。次に、プランはユーザーごとに実行コンテキストで使用されます。 回答の詳細はこちら

  • JOIN順序は、ほとんどすべての場合に無関係です

SQLは宣言型です。これは、エンジンに必要なものを伝え、最適化プログラムが最適なプランを作成することを意味します(理由により、最適なプランを作成するには2週間かかる場合があります)。これが、同じ答えを得るためにクエリをさまざまな方法で書き直すことができる理由です。

RDBMSに関する規則と同様に、例外があります。複雑なクエリの場合、オプティマイザーはすべての順列を通過するわけではないため、JOINの順序が重要になる可能性があります。オプティマイザーが十分であると判断するタイミングによって異なります...

他のヒント

(ここにSQL Serverがあると仮定すると、指定しなかった...)

実行計画はキャッシュされ、クエリをパラメーター化する程度まで再利用できます。

基になるテーブルまたはインデックスを変更すると、SQL Serverはこれらのものの変更日とキャッシュされた実行プランを認識し、新しい条件のクエリを再評価できます。統計が更新されるときも同じことです。テーブル/インデックスの設計だけでなく、実際のデータが計画を左右することもあります。

結合は、内部と外部に基づいた順序ではなく、オプティマイザーがクエリを最も迅速に実行すると考えるものに基づいて行われます。詳細はデータベースによって異なります。ただし、基本的に、クエリオプティマイザーはインデックスの使用を最適化しようとします。

このクエリがあったとします:

select a.foo, b.bar
from a
join b on b.b_id=a.b_id
where a.some_number=42;

今、b.b_idには一意のインデックスがあり、a.some_numberにはインデックスがないと仮定します。

クエリオプティマイザーには2つの選択肢があります。bでフルファイルシーケンシャル読み取りを実行し、次にbごとにb_idとsome_number = 42で一致を探してフルファイルシーケンシャル読み取りを実行できます。それはa ^ bレコードで読み込まれます。または、some_number = 42を探してフルファイルシーケンシャル読み取りを実行し、aごとにインデックスを使用して、b_idが一致するbからレコードをすばやく見つけることができます。つまり、a * 2レコードを読み取ります。明らかに、2番目の計画の方がはるかに優れているため、それが選択されます。

テーブルを追加すると、計算はより複雑になりますが、原理は同じです。他のテーブルで見つかった値を使用してインデックスをすばやく読み取る結合は、後で他のテーブルが読み取られた後に実行されます。何が何であれ、または他のレコードからの値ではなく定数に基づいてどこで読み取られても、順番に読み取られなければならないテーブルは、通常最初に読み取られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top