点击(此处)折叠或打开
点击(此处)折叠或打开
-----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 96 | 142 (2)| 00:00:02 |
|* 1 | HASH JOIN RIGHT SEMI | | 1 | 96 | 142 (2)| 00:00:02 |
| 2 | VIEW | VW_NSO_1 | 1631 | 29358 | 71 (2)| 00:00:01 |
| 3 | HASH GROUP BY | | 1631 | 50561 | 71 (2)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| CM_JC_F_SPF_BONUS_GF | 1631 | 50561 | 70 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_CM_JC_F_SPF_BONUS_GF | 1636 | | 9 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | CM_JC_F_SPF_BONUS_GF | 1631 | 124K| 70 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX_CM_JC_F_SPF_BONUS_GF | 1636 | | 9 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("J_MATCH_ID"="$nso_col_1" AND "CREATETIME"="$nso_col_2")
5 - access("LOTTERPERIOD"='2014-04-17' AND "LOTTERYCODE"='108')
7 - access("LOTTERPERIOD"='2014-04-17' AND "LOTTERYCODE"='108')
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
129 consistent gets
0 physical reads
0 redo size
3173 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
26 rows processed
可以看到这样修改之后cost值和逻辑读都大幅度降低了
2.另一个语句是这样的,在一张订单表上要统计各个代理商的销售额,这个本来其实很简单的,sum加group by就行了。但由于当初设计的问题,有几个代理商在系统里面有好几个不同的代理商编号,但在统计结算的时候他们都是算一家的。原先的sql是把这几个代理商单独拎出来统计然后再union all合并:
点击(此处)折叠或打开
-----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 122 | 30 (10)| 00:00:01 |
| 1 | SORT ORDER BY | | 4 | 122 | 29 (63)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | HASH GROUP BY | | 2 | 80 | 13 (16)| 00:00:01 |
|* 4 | FILTER | | | | | |
|* 5 | HASH JOIN | | 2 | 80 | 12 (9)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| CM_ORDERINFO_REPORT | 4 | 84 | 8 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | INDEX_REPORT_COPERDATE | 6 | | 3 (0)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | CM_AGENT_INFO | 86 | 1634 | 3 (0)| 00:00:01 |
| 9 | SORT AGGREGATE | | 1 | 21 | | |
|* 10 | FILTER | | | | | |
|* 11 | TABLE ACCESS BY INDEX ROWID | CM_ORDERINFO_REPORT | 1 | 21 | 8 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | INDEX_REPORT_COPERDATE | 6 | | 3 (0)| 00:00:01 |
| 13 | SORT AGGREGATE | | 1 | 21 | | |
|* 14 | FILTER | | | | | |
|* 15 | TABLE ACCESS BY INDEX ROWID | CM_ORDERINFO_REPORT | 2 | 42 | 8 (0)| 00:00:01 |
|* 16 | INDEX RANGE SCAN | INDEX_REPORT_COPERDATE | 6 | | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter(TRUNC(
6 - filter("A"."CAGENTCODE" NOT LIKE '10771%' AND "A"."ISCPROCFLAG"=0 AND
"A"."CAGENTCODE"<>'1100' AND "A"."CAGENTCODE" NOT LIKE '60%')
7 - access("A"."COPERDATE">=TRUNC(SYSDATE@!)-1 AND "A"."COPERDATE"
10 - filter(TRUNC(
12 - access("COPERDATE">=TRUNC(SYSDATE@!)-1 AND "COPERDATE"
----------------------------------------------------------
0 recursive calls
0 db block gets
68191 consistent gets
0 physical reads
0 redo size
1485 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
26 rows processed
其实如此的union案例是有一个比较经典的解决方法的,那就是用case when来代替:
点击(此处)折叠或打开
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 312 | 13 (16)| 00:00:01 |
| 1 | SORT GROUP BY | | 6 | 312 | 13 (16)| 00:00:01 |
|* 2 | FILTER | | | | | |
|* 3 | HASH JOIN | | 6 | 312 | 12 (9)| 00:00:01 |
|* 4 | TABLE ACCESS BY INDEX ROWID| CM_ORDERINFO_REPORT | 6 | 126 | 8 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | INDEX_REPORT_COPERDATE | 6 | | 3 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | CM_AGENT_INFO | 86 | 2666 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TRUNC(
THEN '1100' WHEN ("CAGENTCODE" LIKE '10771%') THEN '1077106' ELSE "CAGENTCODE" END )
4 - filter("ISCPROCFLAG"=0)
5 - access("COPERDATE">=TRUNC(SYSDATE@!-1) AND "COPERDATE"
----------------------------------------------------------
0 recursive calls
0 db block gets
22735 consistent gets
0 physical reads
0 redo size
1482 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
26 rows processed
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/20777547/viewspace-1144174/ ,如需转载,请注明出处,否则将追究法律责任。