2017-07-06 8 views
1

oracleクエリのUnionがFTS(フル・テーブル・スキャン)を頻繁に実行していて、このクエリを書き直すことができます。UNIONを使用したパフォーマンスの問題

  SELECT 
          tab1.a1, 
          tab1.a2 , 
          tab2.b1, 
          tab2.b2 


      FROM tab1 ,tab2 
        where tab1.aid = tab2.aid 
        and tab1.bid = tab2.bid 
      UNION 
      SELECT 
          tab1.a1, 
          tab1.a2, 
          tab3.c1, 
          tab3.c2 
      FROM tab1 ,tab3 
        where tab1.cid = tab3.cid 
        and tab1.bid =tab3.bid; 

このようなかなりのルックス計画を説明。..

    | Id | Operation      | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | 
       --------------------------------------------------------------------------------------- 
       | 0 | SELECT STATEMENT    | 1845K| 61M|  | 120K (1)| 00:00:05 | 
       | 1 | UNION-ALL     |  |  |  |   |   | 
       | 2 | MERGE JOIN     | 1719K| 57M|  | 98522 (2)| 00:00:04 | 
       | 3 | SORT JOIN     | 1761K| 25M| 94M| 30984 (1)| 00:00:02 | 
       | 4 |  TABLE ACCESS FULL   | 1761K| 25M|  | 21911 (1)| 00:00:01 | 
       |* 5 | SORT JOIN     | 1882K| 35M| 115M| 67538 (2)| 00:00:03 | 
       | 6 |  TABLE ACCESS FULL   | 1882K| 35M|  | 56061 (2)| 00:00:03 | 
       | 7 | NESTED LOOPS    | 126K| 3699K|  | 22186 (1)| 00:00:01 | 
       | 8 | NESTED LOOPS    | 126K| 3699K|  | 22186 (1)| 00:00:01 | 
       | 9 |  TABLE ACCESS FULL   | 126K| 1726K|  | 3232 (2)| 00:00:01 | 

指数は

(TAB1(援助、入札)、TAB2(援助、入札)、TAB3(CID、入札))であります
+0

クエリにはWHERE句がありません。つまり、すべてのtab1レコードと、おそらく多くの、多くのtab2とtab3レコードが含まれています。だから、完全なテーブルスキャンは、ほとんどのレコードで終わるために索引を混乱させるのではなく、テーブルを読み取る最良の方法と思われます。あなたの質問は本当の仕事を難読化しています。 user5480949の答えははるかに明確なクエリを示しています。 –

+1

あなたは1980年代に使用した結合構文を使用しています。オラクルはそれを採用するのが遅かったのですが、それでも2001年頃でした!もう使用しないでください。代わりに、適切なANSI結合を使用します。 'tab1からの内部結合tab2からtab1.aid = tab2.aidおよびtab1.bid = tab2.bid'を生成する。 –

答えて

2
SELECT t.a1, t.a2 
FROM tab1 t 
WHERE EXISTS (SELECT 1 
       FROM tab2 t2 
       WHERE t.aid = t2.aid 
       AND t.bid = t2.bid) 
OR EXISTS (SELECT 1 
      FROM tab3 t3 
      WHERE t.cid = t3.cid 
      AND t.bid =t3.bid) 
+0

はい、それは簡単な方法でクエリを書くことです。 –

+0

@ user5480949、おかげで、クエリのために、briliantly動作し、正しい出力を与える、何とか私はクエリのtab2とtab3列を追加することができなかった、あなたが与えたクエリを追加するには、私はその質問の編集をしました。 – anudeepks

+0

@anudeepks:tab2列とtab3列を選択すると、新しいクエリは以前のクエリとはまったく異なります。だからあなたはこれを新しい要求にすることができます。 –

関連する問題