首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UNION、多列时的性能问题

使用UNION、多列时的性能问题
EN

Stack Overflow用户
提问于 2017-07-06 17:11:24
回答 1查看 146关注 0票数 1

oracle查询中的Union导致了大量的FTS (全表扫描)和高行计数,有没有更好的方法来重写这个查询?

使用UNION时的性能问题

代码语言:javascript
复制
    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))

EN

回答 1

Stack Overflow用户

发布于 2017-07-07 09:04:22

通常,UNION不会导致FTS。如果优化器认为它可以更好地扫描所有行,那么FTS就由优化器决定,而不是先进行索引访问,然后再进行表访问。因此,我认为这个问题存在一些问题:

  1. 没有数据子设置,这意味着您无论如何都想要所有行,所以如果是这样,那么FTS可能是成本最低的选项。
  2. 如果没有数据子设置,使用索引的唯一可能方式是如果"join列“至少是FTS后面的表中的索引(在某些情况下,您可能希望较小的表是FTS,然后根据连接条件列是索引来对较大的表进行索引访问)。
  3. 您不指明表的大小或索引是什么;基数等方面的知识对于SQL调优至关重要。

此外,如果您拥有SQL的许可证,则可以通过SQL运行Diagnostics+Tuning,并查看此工具提供了哪些调优建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44944555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档