2

クエリで 2 ~ 3 個を超えるテーブルを結合する場合、すべてのテーブルに共通の列がある場合、パフォーマンスに違いはありますか?

  1. すべてのテーブルの共通の列に値を指定します。

    例:

    select e.*
    from emp e, dept d
    where e.deptno = 10
    and d.deptno = 10;
    
  2. 共通の列の 1 つに値を与え、他の列と結合する

    例:

    select e.*
    from emp e, dept d
    where e.deptno = 10
    and d.deptno = e.deptno;
    

この質問をする理由は、例 1 のように値を指定すると実行されるクエリ (コストは 17) がありますが、例 2 のように列を結合するとハングして実行されないためです。

これを理解するのを手伝ってください。

4

2 に答える 2

2

それはインデックスに依存します。両方のテーブルのその列にインデックスがある場合、違いはありません。しかし、そうでない場合は、2 番目の方がはるかに遅くなる可能性があります。

deptnoはユニークですか?(いずれかの表で) それが CERTAIN である場合は、そのようにインデックスを設定します。

于 2012-08-28T08:06:48.590 に答える
1

一意性の問題については同意しません。DEPTNOは、どちらのテーブルでも一意である必要はありませんが、一意でない場合、クエリの応答が非常に遅くなる可能性があります。インデックスに関して-はい、DEPTNOのみのインデックスか、両方のテーブルの最初のフィールドとしてDEPTNOを使用するインデックスが必要です。このようなインデックスがないと、クエリは非常に遅くなります。

クエリ構造について-私はANSIクエリ構文を好みます:

SELECT e.*
  FROM EMP e
  INNER JOIN DEPT d
    ON (d.DEPTNO = e.DEPTNO)
  WHERE e.DEPTNO = 10

DEPTNO = 10のDEPTに行がない可能性がない限り、DEPTテーブルのデータを使用していないため、DEPTテーブルが結合されている理由がわかりません。DEPTNO = 10のDEPTに行が存在すると仮定すると、次を実行しても同じ結果が得られます。

SELECT e.*
  FROM EMP e
  WHERE e.DEPTNO = 10

EMPからの各結果行にDEPTを結合するコストを支払うことなく、次に向きを変えてDEPTからのデータを破棄します。

共有してお楽しみください。

于 2012-08-28T11:40:43.487 に答える