oracle查询中的Union导致了大量的FTS (全表扫描)和高行计数,有没有更好的方法来重写这个查询?
使用UNION时的性能问题
SELECT
store.store_name name,
store.block_id block_id,
store.marker flag,
substr('A',1,1) store_type,
substr(area.area_code,1,5) area_code,
substr(area.area_name,1,5) area_name
FROM store , area
where store.store_id = area.store_id
and store.block_id = area.block_id
UNION
SELECT
store.store_name name,
store.block_id block_id,
store.marker flag,
substr('A',1,1) store_type,
substr(market.market_code,1,5) area_code,
substr(market.market_area,1,5) area_name
FROM store , market
where store.store_id = market.store_id
and store.block_id =market.block_id;
| 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 |索引为on (tab1 (aid,bid),tab2(aid,bid),tab3(cid,bid))
发布于 2017-07-07 09:04:22
通常,UNION不会导致FTS。如果优化器认为它可以更好地扫描所有行,那么FTS就由优化器决定,而不是先进行索引访问,然后再进行表访问。因此,我认为这个问题存在一些问题:
此外,如果您拥有SQL的许可证,则可以通过SQL运行Diagnostics+Tuning,并查看此工具提供了哪些调优建议。
https://stackoverflow.com/questions/44944555
复制相似问题