sql優化小例子

客戶業務系統隨着數據量的增大出現運行速度降低問題,通過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效率明顯提高。

發佈了33 篇原創文章 · 獲贊 28 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章