Oracle的SQL优化二

来源:互联网 发布:淘宝如何退保证金 编辑:程序博客网 时间:2024/05/18 02:37
收到开发提交的一条SQL,在高并发下较慢,看能否做一些优化:
该SQL是1个表对另一个表做Left join,首先执行下看看,
SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,reducepresentnum 
  2  from  HQ_07310066.m_mempoint_logs l left join  HQ_07310066.m_memdetail m on l.vcno = m.vcno where 1=1 AND l.memid = 'WX000000361' order by optdate desc;
已选择208行。
执行计划
----------------------------------------------------------
Plan hash value: 2095947206
--------------------------------------------------------------------------------------
| Id  | Operation          | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                 |     4 |   464 |   172   (2)| 00:00:03 |
|   1 |  SORT ORDER BY     |                 |     4 |   464 |   172   (2)| 00:00:03 |
|*  2 |   TABLE ACCESS FULL| M_MEMPOINT_LOGS |     4 |   464 |   171   (1)| 00:00:03 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("L"."MEMID"='WX000000361')
统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        626  consistent gets
          0  physical reads
          0  redo size
       7125  bytes sent via SQL*Net to client
        663  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        208  rows processed
可能是主外键约束的原因,优化器自动对HQ_07310066.m_memdetail做了表消除。所以如果确定两表之间存在严格的主外键约束,可以直接在SQL中把不需要的表去掉,如下:
SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,
  2  reducepresentnum 
  3  from  HQ_07310066.m_mempoint_logs l 
  4  where  l.memid = 'WX000000361' 
  5  order by optdate desc;
已选择208行。
已用时间:  00: 00: 00.02
执行计划
----------------------------------------------------------
Plan hash value: 2095947206
--------------------------------------------------------------------------------------
| Id  | Operation          | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                 |     4 |   464 |   172   (2)| 00:00:03 |
|   1 |  SORT ORDER BY     |                 |     4 |   464 |   172   (2)| 00:00:03 |
|*  2 |   TABLE ACCESS FULL| M_MEMPOINT_LOGS |     4 |   464 |   171   (1)| 00:00:03 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("L"."MEMID"='WX000000361')
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        626  consistent gets
          0  physical reads
          0  redo size
      11245  bytes sent via SQL*Net to client
        663  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        208  rows processed
再创建索引:create index  HQ_07310066.i_m_mempoint_logs_optdate on  HQ_07310066.m_mempoint_logs(optdate);
SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,
  2  reducepresentnum 
  3  from  HQ_07310066.m_mempoint_logs l 
  4  where  l.memid = 'WX000000361' 
  5  order by optdate desc;
已选择208行。
已用时间:  00: 00: 00.02
执行计划
----------------------------------------------------------
Plan hash value: 3466595853
----------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                           |     4 |   464 |     6  (17)| 00:00:01 |
|   1 |  SORT ORDER BY               |                           |     4 |   464 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| M_MEMPOINT_LOGS           |     4 |   464 |     5   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | I_M_MEMPOINT_LOGS_OPTDATE |     4 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("L"."MEMID"='WX000000361')
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         44  consistent gets
          2  physical reads
          0  redo size
      11245  bytes sent via SQL*Net to client
        663  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
        208  rows processed
优化完成。
1 0