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、入札))であります
クエリにはWHERE句がありません。つまり、すべてのtab1レコードと、おそらく多くの、多くのtab2とtab3レコードが含まれています。だから、完全なテーブルスキャンは、ほとんどのレコードで終わるために索引を混乱させるのではなく、テーブルを読み取る最良の方法と思われます。あなたの質問は本当の仕事を難読化しています。 user5480949の答えははるかに明確なクエリを示しています。 –
あなたは1980年代に使用した結合構文を使用しています。オラクルはそれを採用するのが遅かったのですが、それでも2001年頃でした!もう使用しないでください。代わりに、適切なANSI結合を使用します。 'tab1からの内部結合tab2からtab1.aid = tab2.aidおよびtab1.bid = tab2.bid'を生成する。 –