Sql 使用UNION的性能问题
oracle查询中的Union导致了大量FTS(全表扫描)和高行数。有没有更好的方法重写此查询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
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)