客戶業務系統隨着數據量的增大出現運行速度降低問題,通過AWR報告分析發現運行效率低的SQL,如下:
select * from scott.計劃產品出生證表 where 序號=(select min(序號) from scott.計劃產品出生證表 where 任務單號= ‘xxxx-xxx-xxx’ and 產品狀態=’正在執行’)
其執行計劃
-----------------------------------------------------------------------------------------------
Plan hash value: 2054637612
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 131 | 851 (2)| 00:00:11 |
|* 1 | TABLE ACCESS FULL | 計劃_產品出生證 | 1 | 131 | 838 (2)| 00:00:11 |
| 2 | SORT AGGREGATE | | 1 | 29 | | |
|* 3 | TABLE ACCESS BY INDEX ROWID| 計劃_產品出生證 | 1 | 29 | 13 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | 計劃_產品出生證 | 366 | | 4 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
----------------------------------------------------------------------------------------------
1 - filter("序號"= (SELECT MIN("序號") FROM "SCOTT"."計劃_產品出生證表" "計劃_產品出生證表" WHERE
"產品狀態"='正在執行' AND "任務單號"='170511-P22-001'))
3 - filter("任務單號"='170511-P22-001')
4 - access("產品狀態"='正在執行')
統計信息
----------------------------------------------------------
1 recursive calls
0 db block gets
3802 consistent gets
0 physical reads
0 redo size
1636 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
分析:
執行計劃中id=1的SQL通過全表掃描方式獲取數據,整體的cost值爲851,consistent gets 3802,SQL效率低下。
解決方法:
create index scott.計劃產品出生證表_indx_zxq on scott.計劃產品出生證表(序號);
效果:
優化後的SQL執行計劃執行計劃
Plan hash value: 1523355933
--------------------------------------------------------------------------------------------------------
Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 131 | 15 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | 計劃_產品出生證表 | 1 | 131 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | 計劃_產品出生證表_I | 1 | | 1 (0)| 00:00:01 |
| 3 | SORT AGGREGATE | | 1 | 29 | | |
|* 4 | TABLE ACCESS BY INDEX ROWID| 計劃_產品出生證表 | 1 | 29 | 13 (0) | 00:00:01 |
|* 5 | INDEX RANGE SCAN | 計劃_產品出生證表_I | 366 | | 4 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("序號"= (SELECT MIN("序號") FROM "SCOTT"."計劃_產品出生證表" "計劃_產品出生證表" WHERE
"產品狀態"='正在執行' AND "任務單號"='xxxx-xxx-xxx'))
4 - filter("任務單號"='xxxx-xxx-xxx')
5 - access("產品狀態"='正在執行')
統計信息
----------------------------------------------------------
1 recursive calls
0 db block gets
23 consistent gets
0 physical reads
0 redo size
1636 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
執行計劃中SQL由全表掃描方式改爲索引讀取方式獲取數據,cost值由851降低至15,consistent gets由 3802降低至23, SQL效率明顯提高。