0

この質問に正しい名前を付けたかどうかはわかりませんが、説明が私の問題を説明するのに役立つ場合があります。

何百万ものレコードで構成されるPROJ_MASTERなどのメインテーブルがあります。これには、PROJ_SUB_1やPROJ_SUB_2など、これらのコードの詳細について他のテーブルにマップするコードを持つ列が含まれています。

マスターテーブルにクエリを作成するための最良の方法は何ですか1)列をマッピングします


SELECT PM.SOME_COL_1,
       PM1.COL1,
       PM1.COL2
  FROM PROJ_MASTER PM, PROJ_SUB_1 PS1, PROJ_SUB_2 PS2
 WHERE PM1.COL1 = PS1.COL1
   AND PM1.COL2 = PS2.COL2

2)またはネストされたクエリを使用する


SELECT PM.SOME_COL_1,
       (SELECT DISTINCT PM1.COL1
         FROM PROJ_SUB_1 PS1
       WHERE PM.COL1 = PS1.COL1) AS COL1
       (SELECT DISTINCT PM1.COL2
         FROM PROJ_SUB_2 PS2
       WHERE PM.COL2 = PS2.COL2) AS COL2
  FROM PROJ_MASTER PM

エイリアス(PMの代わりにPM1とPM2)を使用する際にいくつかの間違いをしました。

クエリプランの最初のクエリを表示しています)


SELECT STATEMENT, GOAL = ALL_ROWS   Cost=23827  Cardinality=1037978 Bytes=76810372
 HASH UNIQUE                Cost=23827  Cardinality=1037978 Bytes=76810372
  HASH JOIN             Cost=5638   Cardinality=1037978 Bytes=76810372
   TABLE ACCESS FULL    Object owner=USER   Object name=PROJ_MASTER 
                                    Cost=5  Cardinality=557         Bytes=17267
   HASH JOIN                Cost=5619   Cardinality=872654  Bytes=37524122
    TABLE ACCESS FULL   Object owner=USER   Object name=PROJ_SUB_1
Cost=28 Cardinality=9827 Bytes=294810 TABLE ACCESS FULL Object owner=USER Object name=PROJ_SUB_2
Cost=5579 Cardinality=872654 Bytes=11344502

2番目のクエリ)


SELECT STATEMENT, GOAL = ALL_ROWS     Cost=9810 Cardinality=872654  Bytes=11344502
 TABLE ACCESS FULL  Object owner=USER   Object name=PROJ_SUB_1
Cost=5 Cardinality=1 Bytes=31 TABLE ACCESS FULL Object owner=USER Object name=PROJ_SUB_2
Cost=28 Cardinality=1 Bytes=30 HASH UNIQUE Cost=9810 Cardinality=872654 Bytes=11344502 TABLE ACCESS FULL Object owner=USER Object name=PROJ_MASTER Cost=5579 Cardinality=872654 Bytes=11344502
前もって感謝します。

4

2 に答える 2

2

多くの理由から、最初の方法が最適です。読みやすく理解しやすいです。機能とパフォーマンスによると、最初のほうが優れています。膨大な量のデータで、差を埋めることができます。それは私の経験です。

于 2012-12-06T07:16:16.093 に答える
1

Oracleのようなデータベースは参加するために生まれました。最初のクエリは、実行しようとしていることを実行するための「通常の」方法であり、高速になります。

そうは言っても、いくつかのポイント:

ほとんどの人はANSI結合構文を好むので、これは読みやすくなります。

SELECT PM.SOME_COL_1,
       COL1,
       COL2
  FROM PROJ_MASTER PM 
       JOIN PROJ_SUB_1 USING (COL1) 
       JOIN PROJ_SUB_2 USING (COL2)

PROJ_SUB_1もちろん、とからのいくつかの列を含めることになるでしょうPROJ_SUB_2

2番目のクエリも同様に、テーブルから何かを選択する必要があります。SUBそうしないと、かなり無意味になりますが、これはタイプミスだと思います。この場合、機能の違いは次のとおりです。

  • 一致する行が複数ある場合、クエリは失敗します(ただし、質問から、テーブル間にFK関係があると想定するのは自然なことのようです)。
  • このクエリは通常、最初のクエリよりも冗長で、速度が遅く、読みにくいですが、特定の特性が1つあります。クエリが成功した場合、キーを検索しなくても、各行に対して正確にPROJ_SUB_21つの行が返されることが一目でわかります。と関係。

最後に、DISTINCTFK / PK関係が実際に適用されている場合、は冗長です。

于 2012-12-06T08:00:41.253 に答える