Sql 使用UNION的性能问题

Sql 使用UNION的性能问题,sql,oracle,plsql,oracle11g,oracle12c,Sql,Oracle,Plsql,Oracle11g,Oracle12c,oracle查询中的Union导致了大量FTS(全表扫描)和高行数。有没有更好的方法重写此查询 SELECT tab1.a1, tab1.a2 , tab2.b1, tab2.b2 FROM tab1 ,tab2

oracle查询中的Union导致了大量FTS(全表扫描)和高行数。有没有更好的方法重写此查询

            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(aid,bid)、tab2(aid,bid)、tab3(cid,bid))

是的,这是编写查询的直截了当的方法。@user5480949,感谢您的查询,工作灵活,并给出了正确的输出,我不知怎的错过了在查询中添加tab2和tab3列,无法确定在您提供的查询中添加到哪里,请求帮助我编辑查询。@Anudepks:选择tab2和tab3列后,您的新查询与以前的查询完全不同。因此,您可以将此作为一个新请求。@Thorsten Kettner谢谢我将创建一个新请求您的查询没有
WHERE
子句。所有的tab1记录,可能还有很多很多tab2和tab3记录。因此,全表扫描似乎是读取表的最佳方法,而不是在索引中混淆视听,最终得到大多数记录。不过,您的查询混淆了它的真正任务。user5480949的回答显示了一个更加清晰的查询。您使用的是我们在20世纪80年代使用的连接语法。甲骨文很晚才采用它,但还是在2001年左右!你不应该再使用它了。使用正确的ANSI连接,例如,从tab1.aid=tab2.aid上的tab1内部连接tab2和tab1.bid=tab2.bid中选择
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)