简单的视图合并

简单的视图合并,案例SQL和PLAN如下:

SELECT *
  FROM QQ_VIEW_RRRRRR_FFFFFF
 WHERE howtime >= 0
   And inorout = 1
   And Callid like '%13511232777%'
   AND starttime >= to_date('2017-08-06 00:49:01', 'yyyy-mm-dd hh24:mi:ss')
   And Starttime <= to_date('2017-08-14 23:49:01', 'yyyy-mm-dd hh24:mi:ss')
   AND Howtime >= 0
   AND ((Extention in ('20001',
                       '20002',
                       '20003',
                       '20004',
                      ......
                       '53027',
                       '53028',
                       '53029',
                       '53030',
                       '53031')) OR
       (Agent in ('55001',
                   '55002',
                   '55005',
                   '55006',
                   ......
                   '55935',
                   '55936',
                   '55937',
                   '55938',
                   '55939')))
 ORDER BY starttime DESC

Elapsed: 00:00:11.45
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
Plan hash value: 3993928168

------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                       |  5843 |  2379K|       | 11165   (1)| 00:02:14 |       |       |
|   1 |  SORT ORDER BY                           |                       |  5843 |  2379K|  2472K| 11165   (1)| 00:02:14 |       |       |
|*  2 |   HASH JOIN RIGHT OUTER                  |                       |  5843 |  2379K|       | 10646   (1)| 00:02:08 |       |       |
|   3 |    TABLE ACCESS FULL                     | QC_TTTT_RRRRR_CCCCCCC | 12108 |   378K|       |    21   (0)| 00:00:01 |       |       |
|*  4 |    HASH JOIN OUTER                       |                       |  5843 |  2196K|       | 10625   (1)| 00:02:08 |       |       |
|   5 |     NESTED LOOPS OUTER                   |                       |  5760 |  1811K|       |  7900   (1)| 00:01:35 |       |       |
|*  6 |      HASH JOIN OUTER                     |                       |  5760 |  1411K|       |   622   (1)| 00:00:08 |       |       |
|   7 |       NESTED LOOPS OUTER                 |                       |  5760 |  1220K|       |   492   (1)| 00:00:06 |       |       |
|*  8 |        TABLE ACCESS BY GLOBAL INDEX ROWID| T_SSS                 |  5760 |   990K|       |   491   (1)| 00:00:06 |    70 |    70 |
|*  9 |         INDEX RANGE SCAN                 | IDX_SSS_STTTTT        |    28 |       |       |   312   (1)| 00:00:04 |       |       |
|  10 |        TABLE ACCESS BY INDEX ROWID       | QC_SSSSSS             |     1 |    41 |       |     1   (0)| 00:00:01 |       |       |
|* 11 |         INDEX UNIQUE SCAN                | PK_QC_SSSSSS          |     1 |       |       |     0   (0)| 00:00:01 |       |       |
|  12 |       TABLE ACCESS FULL                  | QC_GGGGGGGGGGG        | 78254 |  2598K|       |   130   (1)| 00:00:02 |       |       |
|  13 |      TABLE ACCESS BY INDEX ROWID         | JJJJJJJJ              |     1 |    71 |       |     2   (0)| 00:00:01 |       |       |
|* 14 |       INDEX UNIQUE SCAN                  | PK_VIEMODELS_UUUUUUUU |     1 |       |       |     1   (0)| 00:00:01 |       |       |
|  15 |     TABLE ACCESS FULL                    | XX_SSSSS_ZZ           |  1051K|    63M|       |  2720   (1)| 00:00:33 |       |       |
------------------------------------------------------------------------------------------------------------------------------------------

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

   2 - access("UNIQUEGUID"="QC_TTTT_RRRRR_CCCCCCC"."UNIQUEID"(+))
   4 - access("UNIQUEID"="CALLID"(+))
   6 - access("UNIQUEGUID"="QC_GGGGGGGGGGG"."UNIQUEID"(+))
   8 - filter("INOROUT"=1 AND "VOICEPATH" IS NOT NULL AND (("EXTENTION"='20001' OR "EXTENTION"='20002' OR "EXTENTION"='20003' OR
              ......"EXTENTION"='53026' OR "EXTENTION"='53027' OR "EXTENTION"='53028' OR "EXTENTION"='53029' O)
   9 - access("STARTTIME">=TO_DATE(' 2017-08-06 00:49:01', 'syyyy-mm-dd hh24:mi:ss') AND "STARTTIME"<=TO_DATE(' 2017-08-14
              23:49:01', 'syyyy-mm-dd hh24:mi:ss'))
       filter("CALLID" LIKE '%13511232777%')
  11 - access("UNIQUEGUID"="QC_SSSSSS"."UNIQUEID"(+))
  14 - access("UNIQUEGUID"="JJJJJJJJ"."UNIQUEID"(+))

SQL执行了11s,返回3条数据,QQ_VIEW_RRRRRR_FFFFFF是一个view,因权限关系无法获取其源码

因无法获取视图元数据,能用的信息只有执行计划。查一下执行计划中的表的详细信息

T_SSS4GB2000W
XX_SSSSS_ZZ80MB 100W  
QC_TTTT_RRRRR_CCCCCCC0.56MB1W 
QC_GGGGGGGGGGG4MB 7W 

 

 

 

 

 

这个SQL的是去掉sort order by 之后SQL毫秒级响应!SQL只返回了3条数据,对这3条数据排序带来的消耗完全可以忽略不计!

为何加不加ORDER BY的区别如此之大?

去掉排序之后的执行计划
Elapsed: 00:00:00.02
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3169504018

---------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                       |  5843 |  2379K| 10647   (1)| 00:02:08 |       |       |
|*  1 |  HASH JOIN RIGHT OUTER                  |                       |  5843 |  2379K| 10647   (1)| 00:02:08 |       |       |
|   2 |   TABLE ACCESS FULL                     | QQ_VIEW_RRRRRR_FFFFFF | 12108 |   378K|    21   (0)| 00:00:01 |       |       |
|*  3 |   HASH JOIN OUTER                       |                       |  5843 |  2196K| 10626   (1)| 00:02:08 |       |       |
|   4 |    NESTED LOOPS OUTER                   |                       |  5760 |  1811K|  7901   (1)| 00:01:35 |       |       |
|*  5 |     HASH JOIN OUTER                     |                       |  5760 |  1411K|   623   (1)| 00:00:08 |       |       |
|   6 |      NESTED LOOPS OUTER                 |                       |  5760 |  1220K|   493   (1)| 00:00:06 |       |       |
|*  7 |       TABLE ACCESS BY GLOBAL INDEX ROWID| T_SSS                 |  5760 |   990K|   492   (1)| 00:00:06 |    70 |    70 |
|*  8 |        INDEX RANGE SCAN                 | IDX_SSS_STTTTT        |    28 |       |   313   (1)| 00:00:04 |       |       |
|   9 |       TABLE ACCESS BY INDEX ROWID       | QC_SSSSSS             |     1 |    41 |     1   (0)| 00:00:01 |       |       |
|* 10 |        INDEX UNIQUE SCAN                | PK_QC_SSSSSS          |     1 |       |     0   (0)| 00:00:01 |       |       |
|  11 |      TABLE ACCESS FULL                  | QC_GGGGGGGGGGG        | 78254 |  2598K|   130   (1)| 00:00:02 |       |       |
|  12 |     TABLE ACCESS BY INDEX ROWID         | JJJJJJJJ              |     1 |    71 |     2   (0)| 00:00:01 |       |       |
|* 13 |      INDEX UNIQUE SCAN                  | PK_VIEMODELS_UUUUUUUU |     1 |       |     1   (0)| 00:00:01 |       |       |
|  14 |    TABLE ACCESS FULL                    | XX_SSSSS_ZZ           |  1051K|    63M|  2720   (1)| 00:00:33 |       |       |
---------------------------------------------------------------------------------------------------------------------------------

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

   1 - access("UNIQUEGUID"="QQ_VIEW_RRRRRR_FFFFFF"."UNIQUEID"(+))
   3 - access("UNIQUEID"="CALLID"(+))
   5 - access("UNIQUEGUID"="QC_GGGGGGGGGGG"."UNIQUEID"(+))
   7 - filter("INOROUT"=1 AND "VOICEPATH" IS NOT NULL AND (("EXTENTION"='20001' OR "EXTENTION"='20002' OR
              "EXTENTION"='20003' OR "EXTENTION"='20004' OR "EXTENTION"='20005' OR "EXTENTION"='20006' OR "EXTENTION"='20007' OR
              "......"EXTENTION"='53025' OR "EXTENTION"='53026' OR "EXTENTION"='53027' OR "EXTENTION"='53028' OR "EXTENTION"='53029' O)
   8 - access("STARTTIME">=TO_DATE(' 2017-08-06 00:49:01', 'syyyy-mm-dd hh24:mi:ss') AND "STARTTIME"<=TO_DATE('
              2017-08-14 23:49:01', 'syyyy-mm-dd hh24:mi:ss'))
       filter("CALLID" LIKE '%13511232777%')
  10 - access("UNIQUEGUID"="QC_SSSSSS"."UNIQUEID"(+))
  13 - access("UNIQUEGUID"="JJJJJJJJ"."UNIQUEID"(+))

排序是SQL语句中最后的一步操作。不过根据我自己的理解,优化器在处理ORDER BY的时候并不是先过滤之后再ORDER BY,而是ORDER BY之后再去做其他操作。根据常识推,优化器对有序数据的使用连接方式(NEST LOOP、HASH、SORT MERGE JOIN)性能都优于无序数据,所以优化器会优先ORDER BY,也就是对于排序字段所在的表T_SYS先排序在做了后面的操作,所以11s几乎全部用在大表的排序上了【以上分析完全属于个人推测,没有文档支撑】

所以只需要优化浪费在排序上面的操作即可! 常用的消除sort order by的手段就是建索引。因为索引存储的时候已经排过序。

但是这里排序字段上本来就有索引,为何plan中仍然存在sort order by?因为OUTER JOIN

尝试别的方法,通过SQL语句限制,先过滤 再排序,而这个case中过滤之后只剩3条数据,再排序。排序几乎不会产生任何cost

QQ_VIEW_RRRRRR_FFFFFF是一个视图,而我们在执行计划中没有匹配到!说明这个视图被合并了(展开),如果强制视图不合并(作为一个整体),常量条件推进去,这时候SQL就会优先返回视图的结果集,即3条语句,再order by这三条数据,问题可破!

使用/*+ no_merge(QQ_VIEW_RRRRRR_FFFFFF) */ 强制视图不合并,作为一个整体,整个SQL不到1s响应,得到的执行计划如下:

Elapsed: 00:00:00.31

Execution Plan
----------------------------------------------------------
Plan hash value: 3496577580

-------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                 | Name                  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |                       |  5616 |  7919K|       | 12065   (1)| 00:02:25 |       |       |
|   1 |  SORT ORDER BY                            |                       |  5616 |  7919K|  9000K| 12065   (1)| 00:02:25 |       |       |
|   2 |   VIEW                                    | QC_VIEW_RECORD_FORVIE |  5616 |  7919K|       | 10364   (1)| 00:02:05 |       |       |
|*  3 |    HASH JOIN OUTER                        |                       |  5616 |  2281K|       | 10364   (1)| 00:02:05 |       |       |
|   4 |     NESTED LOOPS OUTER                    |                       |  5537 |  1908K|       |  7639   (1)| 00:01:32 |       |       |
|*  5 |      HASH JOIN OUTER                      |                       |  5537 |  1524K|       |   644   (1)| 00:00:08 |       |       |
|*  6 |       HASH JOIN RIGHT OUTER               |                       |  5537 |  1340K|       |   513   (1)| 00:00:07 |       |       |
|   7 |        TABLE ACCESS FULL                  | QQ_VIEW_RRRRRR_FFFFFF | 12108 |   378K|       |    21   (0)| 00:00:01 |       |       |
|   8 |        NESTED LOOPS OUTER                 |                       |  5537 |  1167K|       |   492   (1)| 00:00:06 |       |       |
|*  9 |         TABLE ACCESS BY GLOBAL INDEX ROWID| T_SSS                 |  5537 |   946K|       |   491   (1)| 00:00:06 |    70 |    70 |
|* 10 |          INDEX RANGE SCAN                 | IDX_SSS_STTTTT        |    42 |       |       |   312   (1)| 00:00:04 |       |       |
|  11 |         TABLE ACCESS BY INDEX ROWID       | QC_SSSSSS             |     1 |    41 |       |     1   (0)| 00:00:01 |       |       |
|* 12 |          INDEX UNIQUE SCAN                | PK_QC_SSSSSS          |     1 |       |       |     0   (0)| 00:00:01 |       |       |
|  13 |       TABLE ACCESS FULL                   | QC_GGGGGGGGGGG        | 78254 |  2598K|       |   130   (1)| 00:00:02 |       |       |
|  14 |      TABLE ACCESS BY INDEX ROWID          | JJJJJJJJ              |     1 |    71 |       |     2   (0)| 00:00:01 |       |       |
|* 15 |       INDEX UNIQUE SCAN                   | PK_VIEMODELS_UUUUUUUU |     1 |       |       |     1   (0)| 00:00:01 |       |       |
|  16 |     TABLE ACCESS FULL                     | XX_SSSSS_ZZ           |  1051K|    63M|       |  2720   (1)| 00:00:33 |       |       |
-------------------------------------------------------------------------------------------------------------------------------------------

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

   3 - access("UNIQUEID"="CALLID"(+))
   5 - access("UNIQUEGUID"="QC_GGGGGGGGGGG"."UNIQUEID"(+))
   6 - access("UNIQUEGUID"="QQ_VIEW_RRRRRR_FFFFFF"."UNIQUEID"(+))
   9 - filter("INOROUT"=1 AND "VOICEPATH" IS NOT NULL AND "VOICESIZE">0 AND (("EXTENTION"='20001' OR "EXTENTION"='20002' OR 
              "EXTENTION"='53025' OR "EXTENTION"='53026' OR "EXTENTION"='53027' OR "EXTENTION"='53028' OR "EX)
  10 - access("STARTTIME">=TO_DATE(' 2017-08-06 00:49:01', 'syyyy-mm-dd hh24:mi:ss') AND "STARTTIME"<=TO_DATE(' 2017-08-14
              23:49:01', 'syyyy-mm-dd hh24:mi:ss'))
       filter("CALLID" LIKE '%13511232777%')
  12 - access("UNIQUEGUID"="QC_SSSSSS"."UNIQUEID"(+))
  15 - access("UNIQUEGUID"="JJJJJJJJ"."UNIQUEID"(+))

在上面的执行计划中可以看到VIEW关键字 和 视图名QQ_VIEW_RRRRRR_FFFFFF,说明视图被当做一个整体来处理!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值