6

SQLでのステートメントの実行順序に関して、次のパフォーマンスの点で違いはありますか?

SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')

と:

SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'

違いがある場合は、これについてもっと知ることができるリンクなどがありますか?

トンありがとう、

カイル

4

7 に答える 7

4

オプティマイザーは、コストベースのオプティマイザーを使用するため、どの「ルート」が最適かを決定します。統計に基づいてオプションのコストがかかり、そこから進みます。用語の順序に違いはありません (ただし、入れ子にする方法によって違いが生じる場合があります)。

編集: Oracle には、ごく最近までルールベースのオプティマイザー (RBO) がありましたが、現在は廃止されています。RBO は統計に基づいていないため、述語の順序に応じてクエリ プランに違いが見られました。

于 2010-04-09T13:08:56.327 に答える
2

違いはありません。SQL Server でクエリを取得し、[推定実行プランの表示] アイコンをクリックして、2 つのクエリの実行プランを確認できます。それらは同一である必要があります。

于 2010-04-09T13:12:59.463 に答える
1

次のリンクを追加します。

クエリ プランは、関連するテーブルとインデックスの統計に基づいて選択されます (実行する必要がある操作が与えられます)。選択したクエリ実行プランが最適かどうかは、多くの要因に依存しますが、質問に対する答えは、MS SQL は関係なく同じプランを生成するということです (3 つの条件すべてに対して最適な順序が考慮され、最終的に同じ結果が得られます)。 )。

ただし、プランナーは完璧ではなく、コストを見積もるだけであることに注意してください。そのため、場合によっては (クエリ プランナーの制限を詳細に把握している場合)、クエリ条件を書き直して、プランナーが問題を認識できるようにすることができます。より良いパス。

これは (可能であれば) 重要であることが証明されているクエリに対してのみ試行する必要があります。また、この種の最適化により、データ統計が変更されたときに速度が低下する可能性があることに注意してください。

また、ほとんどの場合、クエリを最適化するためのより良い方法 (インデックスの変更) があり、これはクエリ プランナーに任せる必要があります。

RDBMS の主なポイントの 1 つは、データの取得方法 (クエリの宣言的な性質) を指定しないことでした。ほとんどの場合、今日のクエリ プランナーは適切なプランを見つけてくれます。

于 2010-04-09T14:09:25.403 に答える
1

オプティマイザーは、データを取得するのに最も効率的/費用対効果が高いと判断したため、自由に述語を再配置して実行できます。

WHERE 句の条件の順序は重要ですか?

于 2010-04-09T13:14:00.160 に答える
0

SQL Server 2000 では違いがあります。私はこれでたくさんの頭痛がしました。どうやら、定義されている順序で句を評価します。データをインデックスでフィルター処理するかどうかを指定するには、FROM ステートメントの後に WITH(INDEX(MY_INDEX_NAME1,MY_INDEX_NAME2)) 句を追加する必要がありました。

于 2010-04-09T21:37:49.150 に答える
0

すべての主要な SQL データベースでは、違いはありません

于 2010-04-09T13:08:30.627 に答える
0

まったく違いはありません。どちらも同じ実行計画になります。

于 2010-04-09T13:09:04.997 に答える