14

SQL結合ステートメントのテーブルの順序に意味はありますか?例えば

SELECT dept_name, emp_name 
FROM   Employee 
INNER JOIN Department ON Employee.dept_id = Department.dept_id

SELECT dept_name, emp_name 
FROM Department 
INNER JOIN Employee  ON Employee.dept_id = Department.dept_id

テーブルの順序にパフォーマンス上の利点はありますか?

4

5 に答える 5

14

いいえ、ありません。

ほとんどの(すべてではないにしても)DBMSによるコストベースのオプティマイザの使用。ステートメントを指定する順序は、実行速度に影響しません。

OracleSQLのコストベースの最適化

OracleのコストベースのSQLオプティマイザ(CBO)は、Oracleの非常に洗練されたコンポーネントであり、すべてのOracleクエリの実行を管理します。CBOは、世界で最も洗練されたソフトウェアコンポーネントの1つに進化し、SQLステートメントを評価し、ステートメントの「最良の」実行プランを生成するという難しい仕事をしています。

両方のステートメントは同じ実行プランを生成するため、同じパフォーマンス特性を持ちます。費用は利用可能な統計に基づくことに注意してください。更新された統計は、オプティマイザーが最も効率的な実行プランを生成できるようにするために非常に重要です。

于 2012-06-14T18:36:03.037 に答える
6

一般的に、それは問題ではありません。オプティマイザは、クエリに表示される順序に関係なく、テーブルを結合する最も効率的な順序を把握できる必要があります。

ただし、テーブルの順序がクエリプランに影響を与える可能性があります。これは通常、単純な2つのテーブル結合がある場合には当てはまりませんが、クエリ内のテーブルの数が増えると、可能な結合の数はO(n!)の割合で増えます。非常に迅速に、オプティマイザがすべての可能な結合順序を考慮することが不可能になるため、ツリーを整理するためにさまざまなヒューリスティックを使用する必要があります。その結果、オプティマイザが別の駆動テーブルを選択する状況が発生します。そのテーブルがクエリの10番目のテーブルである場合とは対照的に、そのテーブルがSQLステートメントの最初にリストされている場合です。Jonathan Lewisは、クエリに順序テーブルがどのように表示されるかがクエリプランにどのように影響するかを示す素晴らしいブログ投稿をしています。。細心の注意を払いたい場合は、最初に運転台をリストするのが合理的です。あまり頻繁には役立ちませんが、場合によっては効果がある場合があります。

于 2012-06-14T21:33:09.693 に答える
1

オプティマイザーは、考えられるすべての結合順序の順列をチェックし、コスト値が最も低いものを取得します。つまり、それ自体を最適化すること、つまりステートメントを準備することは、複雑なステートメントのボトルネックになるということです。結合するテーブルが多いほど、チェックする実行プランのバリアントが多くなります。数学的に言えば、n!(階乗)。

ソース: http: //use-the-index-luke.com/sql/join

于 2012-06-14T18:37:29.037 に答える
0

いいえ。オプティマイザは、最適な結合パス、または少なくとも最適な結合パスであると考えているものを判断します。まれな状況では、必要なすべての情報がない場合もありますが、99%の確率で正しく取得されます。他の方法でもSQLステートメントを内部的に書き換えます。

于 2012-06-14T18:37:08.030 に答える
-1

他の回答者が言うように、いいえ。
ただし、一部の内部結合を左結合に置き換えることができるかどうかを考えてください。ほとんどのクエリでは、これはパフォーマンスのメリットです

于 2012-06-14T18:48:39.567 に答える