一个大表的性能优化

生产中采购管理系统的订单查询form查询缓慢;比如在查询2015000004采购版本时;结果窗口POXPOEPO要很长时间才能打开,有时甚至达半个小时;才会弹出结果集form界面。同时form在初次打开时最耗时间;随后再打开时,情况会有所好转;


同时在此form之前的POXPOVPO有时打开也很慢


通过trace及分析,发现以下几个问题

大量db file sequential read和gc current block 2-way

语句执行过程中产生大量的dbfile sequential read和gc current block 2-way其中时间主要消耗在获取结果集中;

********************************************************************************

 

SQL ID: 08jf13kjhjz2k PlanHash: 1858060575

 

SELECT /*+FIRST_ROWS */ 1

FROM

 MTL_CONSUMPTION_TRANSACTIONS MCT,MTL_MATERIAL_TRANSACTIONS MMT WHERE

  MMT.TRANSACTION_ID = MCT.TRANSACTION_ID ANDMMT.TRANSACTION_SOURCE_ID = :B2

  AND MMT.INVENTORY_ITEM_ID = :B1 ANDNVL(MCT.CONSUMPTION_PROCESSED_FLAG,'N')

  <> 'Y' AND ROWNUM < 2

 

 

call     count      cpu    elapsed       disk     query    current        rows

------- ------  -------- ---------- ---------- --------------------  ----------

Parse        2     0.00       0.00          0          0          0           0

Execute     16     0.00       0.00          0          0          0           0

Fetch       15     1.83     196.36      21380     94847          0          14

------- ------  -------- ---------- ---------- --------------------  ----------

total       33     1.83     196.37      21380     94847          0          14

 

Misses in library cacheduring parse: 1

Misses in library cacheduring execute: 1

Optimizer mode: FIRST_ROWS

Parsing user id: 44     (recursive depth: 1)

Number of plan statisticscaptured: 2

 

Rows (1st) Rows (avg) Rows(max)  Row Source Operation

---------- -------------------- ---------------------------------------------------

         0          0          1 COUNT STOPKEY (cr=28473 pr=136 pw=0 time=984748 us)

         0          0          1  NESTED LOOPS  (cr=28473 pr=136pw=0 time=984738 us cost=31 size=26 card=1)

         0          0          1   NESTED LOOPS  (cr=28472 pr=136pw=0 time=983910 us cost=31 size=26 card=1)

         0          0          1    TABLE ACCESS BY INDEX ROWID MTL_MATERIAL_TRANSACTIONS (cr=28471 pr=136pw=0 time=982564 us cost=28 size=17 card=1)

    140382     70652     140382      INDEX RANGE SCAN MTL_MATERIAL_TRANSACTIONS_N2(cr=469 pr=4 pw=0 time=42921 us cost=5 size=0 card=177)(object id 119955)

         0          0          1    INDEX RANGE SCAN TRANSACTION_ID (cr=2 pr=0 pw=0 time=1343 us cost=2size=0 card=1)(object id 212844)

         0          0          1    TABLE ACCESS BY INDEX ROWIDMTL_CONSUMPTION_TRANSACTIONS (cr=0 pr=0 pw=0 time=821 us cost=3 size=9 card=1)

 

 

Elapsed times includewaiting on following events:

  Event waited on                             Times   Max. Wait Total Waited

  ----------------------------------------   Waited ----------  ------------

  library cache lock                              5        0.00          0.00

  library cache pin                               5        0.00          0.00

  Disk file operations I/O                      153        0.00          0.00

  db file sequential read                    435010        0.58       4124.76

  gc current block 2-way                       3038        0.12          1.84

  gc cr grant 2-way                              11        0.00          0.00

  latch: gc element                               5        0.00          0.00

  latch: object queue header operation            4        0.00          0.00

  gc current block congested                      4        0.00          0.00

********************************************************************************

2.相关数据表中数据量庞大

进一步检查查询所涉及的MTL_CONSUMPTION_TRANSACTIONS和MTL_MATERIAL_TRANSACTIONS中数据量巨大;其中MTL_CONSUMPTION_TRANSACTIONS表中数据量达3.7亿多条,仅一个统计条目的查询就消耗了7分多钟;而MTL_CONSUMPTION_TRANSACTIONS记录数也有1000多万条;

SQL> select count(*) fromMTL_CONSUMPTION_TRANSACTIONS;

 

  COUNT(*)

----------

  11683476

 Executed in67.221 seconds

SQL> select count(*) fromMTL_MATERIAL_TRANSACTIONS;

 

  COUNT(*)

----------

 376463701

 Executed in471.42 seconds

3.索引效率低,有大量回表产生

查询过程虽然走了索引,但是其索引效率很低,仅本次执行就花费了614秒。执行计划预估结果集大小与实际结果集大小偏差大;

SQL Text

------------------------------

SELECT /*+FIRST_ROWS */

 1

  FROMMTL_CONSUMPTION_TRANSACTIONS MCT, MTL_MATERIAL_TRANSACTIONS MMT

 WHEREMMT.TRANSACTION_ID = MCT.TRANSACTION_ID

   ANDMMT.TRANSACTION_SOURCE_ID = :B2

   ANDMMT.INVENTORY_ITEM_ID = :B1

   ANDNVL(MCT.CONSUMPTION_PROCESSED_FLAG, 'N') <> 'Y'

   AND ROWNUM< 2

 

Global Information

------------------------------

 Status                                 :  DONE (ALL ROWS)

 InstanceID                            :  2

 Session                                :  APPS (2038:55095)

 SQL ID                                 :  08jf13kjhjz2k

 SQLExecution ID                       :  33578527

 ExecutionStarted                      :  03/22/2018 14:49:35

 FirstRefresh Time                     :  03/22/2018 14:49:42

 Last RefreshTime                      :  03/22/2018 14:59:49

 Duration                               :  614s

 Module/Action                          :  e:PO:frm:POXPOEPO/PO/112_VMI_PO_WCBP_SUPER

 Service                                :  PROD

 Program                                :  frmweb@ebsapp (TNS V1-V3)

 PLSQL EntryIds (Object/Subprogram)    :  149550,1

 PLSQLCurrent Ids (Object/Subprogram)  :  149550,1

 Fetch Calls                            :  1

 

Binds

=====================================

| Name | Position | Type  | Value  |

=====================================

| :B2  |        1 | NUMBER | 4      |

| :B1  |        2 | NUMBER | 7796   |

=====================================

 

Global Stats

============================================================================

| Elapsed |   Cpu  |    IO    | Cluster | Fetch | Buffer | Read  |Read  |

| Time(s) | Time(s) |Waits(s) | Waits(s) | Calls |  Gets  | Reqs | Bytes |

============================================================================

|     614 |   3.70 |      610 |     0.24 |    1 |  60921 | 51701 | 404MB |

============================================================================

SQL Plan Monitoring Details(Plan Hash Value=1858060575)

=============================================================================================

| Id |            Operation             |             Name             | Rows   |   Rows  |

|    |                                  |                              | (Estim) |(Actual) |

=============================================================================================

|  0 | SELECT STATEMENT                 |                              |         |          |

|  1 |   COUNT STOPKEY                  |                              |         |          |

|  2 |   NESTED LOOPS                 |                              |       1 |          |

|  3 |    NESTED LOOPS                |                              |       1|          |

|  4 |     TABLE ACCESS BY INDEX ROWID | MTL_MATERIAL_TRANSACTIONS    |      1 |        0 |

|    |                                  |                              |         |          |

|  5 |      INDEX RANGE SCAN           | MTL_MATERIAL_TRANSACTIONS_N2|     177 |     141K |

|  6 |     INDEX RANGE SCAN            |TRANSACTION_ID               |       1 |          |

|  7 |    TABLE ACCESS BY INDEX ROWID  |MTL_CONSUMPTION_TRANSACTIONS |       1 |          |

=============================================================================================

查看索引最近一次收集统计信息的时间,并不久远;

select last_analyzed from dba_indexes where  index_name ='MTL_MATERIAL_TRANSACTIONS_N2'

LAST_ANALYZED

-------------

2018-03-18

通过以上分析建议有以下两种建议方案

方案一:修改索引,提高索引效率

通过上述分析可以看出性能主要产生在索引MTL_MATERIAL_TRANSACTIONS_N2,尽管统计信息并不过旧,但是此索引的执行效率还是不高,索引产生大量回表读,正是这个原因,造成查询效率低,执行时间长。

为避免大量回表的产生,建议把索引MTL_MATERIAL_TRANSACTIONS_N2由原来的(TRANSACTION_SOURCE_ID,ORGANIZATION_ID,TRANSACTION_DATE)的联合索引修改为由(TRANSACTION_SOURCE_ID,INVENTORY_ITEM_ID ,ORGANIZATION_ID,TRANSACTION_DATE)组成的联合索引;也就是在原来的联合索引中添加INVENTORY_ITEM_ID字段;

同时,为减少对生产系统中影响可以采取先创建新索引,再删除原索引,最后把新索引名变量为原索引的方式。具体过程如下:

1)创建新索引

创建新索引MTL_MATERIAL_TRANSACTIONS_N2_N,此过程在测试系统中执行时间为01:28:45.90。

CREATE INDEX MTL_MATERIAL_TRANSACTIONS_N2_N ON INV.MTL_MATERIAL_TRANSACTIONS  (TRANSACTION_SOURCE_ID , INVENTORY_ITEM_ID , ORGANIZATION_ID , TRANSACTION_DATE )

 PCTFREE 10INITRANS 11 MAXTRANS 255 COMPUTE STATISTICS

 STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS1 MAXEXTENTS 2147483645

 PCTINCREASE0 FREELISTS 1 FREELIST GROUPS 1

 BUFFER_POOLDEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

 TABLESPACE APPS_TS_TX_IDX;

2)删除旧索引

此过程在测试环境执行大约用时10秒左右。

drop index MTL_MATERIAL_TRANSACTIONS_N2;

3)重命名索引

此过程在测试环境执行用时为:00:00:00.05

ALTER INDEX MTL_MATERIAL_TRANSACTIONS_N2_N RENAMETO MTL_MATERIAL_TRANSACTIONS_N2;

4)重建索引前后在测试系统中测试结果对比

通过对比可以发现,仅执行时间从优化前553s缩小到优化后.000116s,此sql执行效率得到提升。

优化前执行信息:

Global Information

------------------------------

 Status                                 :  DONE (ALL ROWS)

 InstanceID                            :  1

 Session                                :  APPS (2634:51725)

 SQL ID                                 : 08jf13kjhjz2k

 SQLExecution ID                       :  16777594

 ExecutionStarted                      :  03/26/2018 09:04:21

 FirstRefresh Time                     :  03/26/2018 09:04:27

 Last RefreshTime                      :  03/26/2018 09:13:34

 Duration                               :  553s

 Module/Action                          :  e:PO:frm:POXPOEPO/PO/112_VMI_PO_WCBP_SUPER

 Service                                :  EBSUAT

 Program                                :  frmweb@ebsuat (TNS V1-V3)

 PLSQL EntryIds (Object/Subprogram)    :  149550,1

 PLSQLCurrent Ids (Object/Subprogram)  :  149550,1

 FetchCalls                            :  1

 

Binds

==========================================

| Name | Position | Type  |      Value |

==========================================

| :B2  |        1 | NUMBER | 4           |

| :B1  |        2 | NUMBER | 7796        |

==========================================

 

Global Stats

============================================================================

| Elapsed |   Cpu  |    IO    | Cluster | Fetch | Buffer | Read  |Read  |

| Time(s) | Time(s) |Waits(s) | Waits(s) | Calls |  Gets  | Reqs | Bytes |

============================================================================

|     553 |   2.23 |      551 |     0.07 |    1 |  50287 | 49244 | 385MB |

============================================================================

SQL Plan Monitoring Details(Plan Hash Value=1858060575)

=============================================================================================

| Id |            Operation             |             Name             | Rows   |   Rows  |

|    |                                  |                              | (Estim) |(Actual) |

=============================================================================================

|  0 | SELECT STATEMENT                 |                              |         |          |

|  1 |  COUNT STOPKEY                 |                              |         |          |

|  2 |   NESTED LOOPS                 |                             |       1 |          |

|  3 |    NESTED LOOPS                |                              |       1 |          |

|  4 |     TABLE ACCESS BY INDEX ROWID | MTL_MATERIAL_TRANSACTIONS    |      1 |        0 |

|    |                                  |                              |         |          |

|  5 |      INDEX RANGE SCAN           |MTL_MATERIAL_TRANSACTIONS_N2 |      31 |     125K |

|  6 |     INDEX RANGE SCAN            |TRANSACTION_ID               |       1 |          |

|  7 |    TABLE ACCESS BY INDEX ROWID  |MTL_CONSUMPTION_TRANSACTIONS |       1 |          |

=============================================================================================

优化后执行信息

Global Information

------------------------------

 Status              : DONE (ALL ROWS)

 InstanceID         :  1

 Session             : APPS (1511:3327)

 SQL ID              : 12bfdjdzhmxc3

 SQLExecution ID    :  16777216

 ExecutionStarted   :  03/26/2018 17:40:31

 First RefreshTime  : 03/26/2018 17:40:31

 Last RefreshTime   : 03/26/2018 17:40:31

 Duration            : .000116s

 Module/Action       : SQL*Plus/-

 Service             : EBSUAT

 Program             : sqlplus@ebsuat (TNS V1-V3)

 FetchCalls         :  2

 

Global Stats

=================================================

| Elapsed |  Cpu   |  Other  | Fetch | Buffer |

| Time(s) | Time(s) | Waits(s) | Calls |  Gets  |

=================================================

|    0.00|    0.00 |     0.00 |    2 |      9 |

=================================================

SQL Plan Monitoring Details(Plan Hash Value=79251601)

==============================================================================================

| Id |            Operation             |              Name              | Rows   |  Rows  |

|    |                                  |                                | (Estim)|(Actual) |

==============================================================================================

|  0 | SELECT STATEMENT                 |                                |         |      1 |

|  1 |  COUNT STOPKEY                 |                                |         |      1 |

|  2 |   NESTED LOOPS                 |                                |       1 |      1 |

|  3 |    NESTED LOOPS                |                                |       1 |      1 |

|  4 |     TABLE ACCESS BY INDEX ROWID | MTL_MATERIAL_TRANSACTIONS      |      1 |       1 |

|  5 |      INDEX RANGE SCAN           |MTL_MATERIAL_TRANSACTIONS_N2_N |       1|       1 |

|  6 |     INDEX RANGE SCAN            |TRANSACTION_ID                 |       1 |      1 |

|  7 |    TABLE ACCESS BY INDEX ROWID  |MTL_CONSUMPTION_TRANSACTIONS   |       1 |      1 |

=============================================================================================

 

方案二:对过期数据进行定时清理归档

此查询影响速度的根本原因是表中数据量庞大所至;所以长远解决方法可以对记录进行归档和清理;清理时注意做好备份;

清理方法可以参考oracle官方文档:

《INVTransaction Purge Which Inventory Purge Program Should Be Used To PurgeTransaction Data (文档 ID 299003.1)》

《InventoryPurging Programs Information (文档 ID 1351271.1)》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值