7

SQLクエリが

SELECT ....
  FROM apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas
 WHERE ....

FROM 副節の他の順列とまったく同じです。

SELECT ....
  FROM oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas,
       apples
 WHERE ....

また

SELECT ....
  FROM bananas,
       apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id
 WHERE ....

オレンジとキウイの間の明示的な LEFT JOIN がそのまま残っている限り。さまざまなドキュメントで読んだことから、返されるセットはまったく同じである必要があります。

実際のデータベースでのパフォーマンスではなく、クエリの結果のみに関心があります。(私は PostgreSQL 8.3 を使用していますが、これは私の知る限り、結合順序に関するオプティマイザーのヒントをサポートしておらず、最適なクエリ プランを自動的に作成しようとします)。

4

3 に答える 3

15

それは同じですが、暗黙のCROSS JOIN では地獄のようにあいまいです。明示的な JOINS を使用します。

WHERE 句で結合している場合、結合とフィルターが混同されているため、結果が異なる場合があります。

SELECT ....
  FROM apples a
       JOIN
       bananas b ON ...
       JOIN 
       oranges o ON ...
       LEFT JOIN
       kiwis k ON k.orange_id = o.id
 WHERE (filters only)

ノート:

  • INNER JOINS と CROSS JOINS は交換可能で結合的です。通常、順序は重要ではありません。
  • あなたが特定したOUTER JOINSはそうではありません
  • SQL は宣言型です。オプティマイザに、実行方法ではなく、必要なものを伝えます。これにより、JOIN 順序に関する考慮事項が削除されます (前の 2 つの項目に従う)。
于 2011-02-15T21:28:49.523 に答える
1

状況は、明示的なJOIN句を使用したプランナーの制御に要約されています。外側の結合は並べ替えられませんが、内側の結合は並べ替えられます。また、クエリを実行する前に* join_collapse_limit *を削除し、必要な順序に並べ替えることで、特定のオプティマイザーの順序を強制できます。これが、この領域のデータベースに「ヒント」を与える方法です。

一般に、EXPLAINを使用して取得している順序を確認する必要があります。これは、2つのクエリが同じ計画を取得していることを視覚的に確認するために使用できる場合があります。

于 2011-02-15T23:44:53.120 に答える
0

私は何年も SQL をやってきましたが、私の経験上、テーブルの順序は問題ではありません。データベースはクエリを全体として見て、最適なクエリ プランを作成します。そのため、データベース企業は、クエリ プランの最適化において博士号を持つ多くの人材を採用しています。

データベース ベンダーは、クエリで SQL を個人的にリストした順序で最適化した場合、商業的な自殺を犯します。

于 2011-02-15T21:25:28.357 に答える