or改写为union all性能提升n倍

SQL> explain plan for SELECT SUM(OCCOUNT) as EVENTCOUNT , F_4 FROM binbin1 WHERE binbin1.EUIDCODE like '19739-19740-704013-%' or binbin1.EUIDCODE like '19739-19740-704018-%' or binbin1.EUIDCODE like '19339-19440-704274-%' AND STARTTIME>=1375237687118 AND STARTTIME<1375927747118 GROUP BY F_4 HAVING SUM(OCCOUNT)>=2;
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 996176126

-----------------------------------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |   658M|   175G|    33M  (2)|111:31:45 |       |       |
|*  1 |  FILTER               |             |       |       |            |          |       |       |
|   2 |   HASH GROUP BY       |             |   658M|   175G|    33M  (2)|111:31:45 |       |       |
|   3 |    PARTITION RANGE ALL|             |   658M|   175G|    33M  (2)|111:14:43 |     1 |   773 |
|*  4 |     TABLE ACCESS FULL | binbin1 |   658M|   175G|    33M  (2)|111:14:43 |     1 |   773 |
-----------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SUM("OCCOUNT")>=2)
   4 - filter("binbin1"."EUIDCODE" LIKE '19739-19740-704013-%' OR
              "binbin1"."EUIDCODE" LIKE '19739-19740-704018-%' OR "STARTTIME">=1375237687118 AND
              "STARTTIME"<1375927747118 AND "binbin1"."EUIDCODE" LIKE '19339-19440-704274-%')

19 rows selected.

上面这个sql跑了一个半小时,将or改写为union all之后如下:
SQL>  select SUM(OCCOUNT) as EVENTCOUNT,F_4 from (SELECT  OCCOUNT, F_4 FROM binbin1 t WHERE EUIDCODE like '19739-19740-704013-%'
  2   AND t.STARTTIME>=1375237687118 AND t.STARTTIME<1375927747118
  3  union all SELECT OCCOUNT, F_4 FROM binbin1 t WHERE t.EUIDCODE like '19739-19740-704018-%'
  4  AND t.STARTTIME>=1375237687118 AND t.STARTTIME<1375927747118
  5  union all SELECT OCCOUNT, F_4 FROM binbin1 t WHERE t.EUIDCODE like '19339-19440-704274-%'
  6  AND t.STARTTIME>=1375237687118 AND t.STARTTIME<1375927747118) GROUP BY F_4 HAVING SUM(OCCOUNT)>=2;

no rows selected

Elapsed: 00:00:31.42

Execution Plan
----------------------------------------------------------
Plan hash value: 3849714746

----------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |             |  2531K|   345M|   129K  (2)| 00:25:52 |       |       |
|*  1 |  FILTER                    |             |       |       |            |          |       |       |
|   2 |   HASH GROUP BY            |             |  2531K|   345M|   129K  (2)| 00:25:52 |       |       |
|   3 |    VIEW                    |             |  2531K|   345M|   129K  (2)| 00:25:49 |       |       |
|   4 |     UNION-ALL              |             |       |       |            |          |       |       |
|   5 |      PARTITION RANGE SINGLE|             |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
|*  6 |       TABLE ACCESS FULL    | binbin1 |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
|   7 |      PARTITION RANGE SINGLE|             |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
|*  8 |       TABLE ACCESS FULL    | binbin1 |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
|   9 |      PARTITION RANGE SINGLE|             |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
|* 10 |       TABLE ACCESS FULL    | binbin1 |   843K|   230M| 43013   (2)| 00:08:37 |   750 |   750 |
----------------------------------------------------------------------------------------------------------


 

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SUM("OCCOUNT")>=2)
   6 - filter("T"."STARTTIME">=1375237687118 AND "T"."STARTTIME"<1375927747118 AND "EUIDCODE"
              LIKE '19739-19740-704013-%')
   8 - filter("T"."STARTTIME">=1375237687118 AND "T"."STARTTIME"<1375927747118 AND "T"."EUIDCODE"
              LIKE '19739-19740-704018-%')
  10 - filter("T"."STARTTIME">=1375237687118 AND "T"."STARTTIME"<1375927747118 AND "T"."EUIDCODE"
              LIKE '19339-19440-704274-%')


Statistics
----------------------------------------------------------
          1  recursive calls
          3  db block gets
     700713  consistent gets
          0  physical reads
          0  redo size
        403  bytes sent via SQL*Net to client
        509  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值