技術分享 | Oracle SQL優化案例一則

本文為墨天輪數據庫管理服務團隊第70期技術分享,內容原創,作者為技術顧問馬奕璇,如需轉載請聯系小墨(VX:modb666)并注明來源。

一、問題概述

開發人員反映有條跑批語句在測試環境執行了很久都沒結束,發現卡在了一個update的sql,取出sql monitor查看,正在執行,已經跑了一個半小時左右還沒結束。

二、問題原因

SQL Text
------------------------------
update gla_glis_h gset (dybsam, cybsam) =(select nvl(sum(drtsam), 0), nvl(sum(crtsam), 0)from gla_glis_h hwhere h.stacid = :1and h.systid = '0000'and h.acctdt >= substr(:2, 0, 4) || '0101'and h.acctdt <= :3and h.geldtp = :4and g.brchcd = h.brchcdand g.itemcd = h.itemcdand g.crcycd = h.crcycdand h.centcd = g.centcdand h.prsncd = g.prsncdand h.custcd = g.custcdand h.prducd = g.prducdand h.prlncd = g.prlncdand h.acctno = g.acctnoand h.assis0 = g.assis0and h.assis1 = g.assis1and h.assis2 = g.assis2and h.assis3 = g.assis3and h.assis4 = g.assis4and h.assis5 = g.assis5and h.assis6 = g.assis6and h.assis7 = g.assis7and h.assis8 = g.assis8and h.assis9 = g.assis9)where g.stacid = :5and g.geldtp = :6and g.acctdt = :7and g.systid = '0000'

執行計劃

Global Information
------------------------------Status              :  EXECUTING           Instance ID         :  1                   Session             :  SUNGL (666:36947)   SQL ID              :  8vmgcmug21gvp       SQL Execution ID    :  16777216            Execution Started   :  03/30/2020 15:44:53 First Refresh Time  :  03/30/2020 15:45:05 Last Refresh Time   :  03/30/2020 17:00:14 Duration            :  4521s               Module/Action       :  JDBC Thin Client/-  Service             :  uattapp             Program             :  JDBC Thin Client    Binds
========================================================================================================================
| Name | Position |     Type     |                                        Value                                        |
========================================================================================================================
| :1   |        1 | NUMBER       | 201                                                                                 |
| :2   |        2 | VARCHAR2(32) | 20191231                                                                            |
| :3   |        3 | VARCHAR2(32) | 20191231                                                                            |
| :4   |        4 | VARCHAR2(32) | H                                                                                   |
| :5   |        5 | NUMBER       | 201                                                                                 |
| :6   |        6 | VARCHAR2(32) | H                                                                                   |
| :7   |        7 | VARCHAR2(32) | 20191231                                                                            |
========================================================================================================================Global Stats
=================================================================================
| Elapsed |   Cpu   |    IO    | Concurrency |  Other   | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) |  Waits(s)   | Waits(s) |  Gets  | Reqs | Bytes |
=================================================================================
|    4520 |    2350 |     0.00 |        0.01 |     2170 |   573M |    2 | 16384 |
=================================================================================SQL Plan Monitoring Details (Plan Hash Value=1242074832)
=====================================================================================================================================================================================
| Id   |               Operation                |     Name      |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |        Activity Detail         |
|      |                                        |               | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |          (# samples)           |
=====================================================================================================================================================================================
|    0 | UPDATE STATEMENT                       |               |         |      |           |        |     1 |          |      |       |          |                                |
| -> 1 |   UPDATE                               | GLA_GLIS_H    |         |      |      4512 |    +12 |     1 |        0 |      |       |     0.16 | log file switch completion (1) |
|      |                                        |               |         |      |           |        |       |          |      |       |          | Cpu (6)                        |
| -> 2 |    PARTITION RANGE SINGLE              |               |   24734 |  848 |      4512 |    +12 |     1 |    91679 |      |       |          |                                |
| -> 3 |     TABLE ACCESS FULL                  | GLA_GLIS_H    |   24734 |  848 |      4524 |     +0 |     1 |    91679 |      |       |     0.04 | Cpu (2)                        |
| -> 4 |    SORT AGGREGATE                      |               |       1 |      |      4512 |    +12 | 91679 |    91678 |      |       |     0.02 | Cpu (1)                        |
| -> 5 |     TABLE ACCESS BY GLOBAL INDEX ROWID | GLA_GLIS_H    |       1 | 4276 |      4512 |    +12 | 91679 |    91719 |      |       |     0.02 | Cpu (1)                        |
| -> 6 |      INDEX RANGE SCAN                  | PK_GLA_GLIS_H |       1 | 4275 |      4522 |     +2 | 91679 |    91719 |    2 | 16384 |    99.76 | Cpu (4486)                     |
|      |                                        |               |         |      |           |        |       |          |      |       |          | latch free (1)                 |
=====================================================================================================================================================================================

從sqlmonitor上看主要耗時在第六步PK_GLA_GLIS_H回表上,這個sql的主要結構是

update GLA_GLIS_H g
set col=(select col from GLA_GLIS_H h where g.xx=h.xx and h.col=“” )
where g.col=“”

查看索引的信息

PK_GLA_GLIS_H primary key (STACID, ACCTDT, SYSTID, BRCHCD, ITEMCD, CRCYCD, GELDTP, CENTCD, PRSNCD, CUSTCD, PRDUCD, PRLNCD, ACCTNO, ASSIS0, ASSIS1, ASSIS2, ASSIS3, ASSIS4, ASSIS5, ASSIS6, ASSIS7, ASSIS8, ASSIS9)

這是一個分區表,分區鍵是ACCTDT,主鍵索引確實全局索引,顯然是不合理的,再從內存獲取執行計劃,查看索引用上的是哪一個列

Predicate Information (identified by operation id):
---------------------------------------------------3 - filter(("G"."ACCTDT"=:7 AND "G"."STACID"=:5 AND "G"."GELDTP"=:6 AND "G"."SYSTID"='0000'))6 - access("H"."STACID"=:1 AND "H"."ACCTDT">=SUBSTR(:2,0,4)||'0101' AND "H"."SYSTID"='0000' AND"H"."BRCHCD"=:B1 AND "H"."ITEMCD"=:B2 AND "H"."CRCYCD"=:B3 AND "H"."GELDTP"=:4 AND "H"."CENTCD"=:B4 AND"H"."PRSNCD"=:B5 AND "H"."CUSTCD"=:B6 AND "H"."PRDUCD"=:B7 AND "H"."PRLNCD"=:B8 AND "H"."ACCTNO"=:B9 AND"H"."ASSIS0"=:B10 AND "H"."ASSIS1"=:B11 AND "H"."ASSIS2"=:B12 AND "H"."ASSIS3"=:B13 AND "H"."ASSIS4"=:B14 AND"H"."ASSIS5"=:B15 AND "H"."ASSIS6"=:B16 AND "H"."ASSIS7"=:B17 AND "H"."ASSIS8"=:B18 AND "H"."ASSIS9"=:B19 AND"H"."ACCTDT"<=:3)filter(("H"."ITEMCD"=:B1 AND "H"."BRCHCD"=:B2 AND "H"."ASSIS1"=:B3 AND "H"."ASSIS0"=:B4 AND"H"."CRCYCD"=:B5 AND "H"."GELDTP"=:4 AND "H"."SYSTID"='0000' AND "H"."CENTCD"=:B6 AND "H"."PRSNCD"=:B7 AND"H"."CUSTCD"=:B8 AND "H"."PRDUCD"=:B9 AND "H"."PRLNCD"=:B10 AND "H"."ACCTNO"=:B11 AND "H"."ASSIS2"=:B12 AND"H"."ASSIS3"=:B13 AND "H"."ASSIS4"=:B14 AND "H"."ASSIS5"=:B15 AND "H"."ASSIS6"=:B16 AND "H"."ASSIS7"=:B17 AND"H"."ASSIS8"=:B18 AND "H"."ASSIS9"=:B19))

–從access與filter對比,實際上索引用到的列有STACID,ACCTDT,SYSTID

–再查看表的統計信息,表總的有接近600w行數據,STACID,ACCTDT,SYSTID 的num_distinct值分別是 9,25,11,篩選度非常低

–外層sql查詢結果大概75w行,作為驅動表再通過篩選度非常低的主鍵索引去篩選符合條件的記錄,性能很差

–將sql monitor獲取到的綁定變量帶入:

–外層sql結果

| :4   |        4 | VARCHAR2(32) | H                                                                                   |
| :5   |        5 | NUMBER       | 201                                                                                 |
| :6   |        6 | VARCHAR2(32) | H                                                                                   |
| :7   |        7 | VARCHAR2(32) | 20191231

select count(1) from sungl.gla_glis_h g where g.stacid = 201
and g.geldtp = ‘H’
and g.acctdt = ‘20191231’
and g.systid = ‘0000’

–754952

–里層sql結果

| :1   |        1 | NUMBER       | 201                                                                                 |
| :2   |        2 | VARCHAR2(32) | 20191231                                                                            |
| :3   |        3 | VARCHAR2(32) | 20191231                                                                            |
| :4   |        4 | VARCHAR2(32) | H

select COUNT(1)
from SUNGL.gla_glis_h h
where h.stacid = 201
and h.systid = ‘0000’
and h.acctdt >= substr(‘20191231’, 0, 4) || ‘0101’
and h.acctdt <= ‘20191231’
and h.geldtp = ‘H’

–755618

–根據sql的連接條件,查看表的統計信息,連接列中篩選度較高的是以下幾個列

用戶                           列                             NUM_DISTINCT  NUM_NULLS 收集方式        最后分析            SAMPLE_SIZE
------------------------------ ------------------------------ ------------ ---------- --------------- ------------------- -----------
SUNGL                          ITEMCD                                 1154          0 HEIGHT BALANCED 2020-03-29 06:02:19        5517
SUNGL                          BRCHCD                                  863          0 HEIGHT BALANCED 2020-03-29 06:02:19        5517
SUNGL                          TRANTI                                  252          0 NONE            2020-03-29 06:02:19    59501917
SUNGL                          ASSIS1                                   70          0 FREQUENCY       2020-03-29 06:02:19        5518
SUNGL                          ASSIS0                                   56          0 FREQUENCY       2020-03-29 06:02:19        5517

三、解決方案

建議添加如下索引(where條件中可篩選的,已經連接條件中篩選度高的):
create index SUNGL.IDX_GLA_GLIS_H on SUNGL.GLA_GLIS_H (SYSTID, STACID, GELDTP, ITEMCD, BRCHCD, CRCYCD, ASSIS1, ASSIS0) local;

添加索引后再次執行,獲取sql monitor如下:

SQL Monitoring ReportSQL Text
------------------------------
update gla_glis_h g set (dybsam,cybsam)= (select nvl(sum(drtsam),0),nvl(sum(crtsam),0) from gla_glis_h h where h.stacid=:1 and h.systid='0000' and h.acctdt >=substr(:2 ,0,4)||'0101' and h.acctdt <=:3 and h.geldtp=:4 and g.brchcd=h.brchcd and g.itemcd=h.itemcd and g.crcycd=h.crcycd and h.centcd=g.centcd and h.prsncd=g.prsncd and h.custcd=g.custcd and h.prducd=g.prducd and h.prlncd =g.prlncd and h.acctno=g.acctno and h.assis0=g.assis0 and h.assis1=g.assis1 and h.assis2=g.assis2 and
h.assis3=g.assis3 and h.assis4=g.assis4 and h.assis5=g.assis5 and h.assis6=g.assis6 and h.assis7=g.assis7 and h.assis8=g.assis8 and h.assis9=g.assis9 ) where g.stacid =:5 and g.geldtp=:6 and g.acctdt=:7 and g.systid='0000'Global Information
------------------------------Status              :  DONE                Instance ID         :  1                   Session             :  SUNGL (3932:6295)   SQL ID              :  8vmgcmug21gvp       SQL Execution ID    :  16777217            Execution Started   :  03/31/2020 08:56:11 First Refresh Time  :  03/31/2020 08:56:21 Last Refresh Time   :  03/31/2020 08:57:59 Duration            :  108s                Module/Action       :  JDBC Thin Client/-  Service             :  uattapp             Program             :  JDBC Thin Client    Binds
========================================================================================================================
| Name | Position |     Type     |                                        Value                                        |
========================================================================================================================
| :1   |        1 | NUMBER       | 201                                                                                 |
| :2   |        2 | VARCHAR2(32) | 20191231                                                                            |
| :3   |        3 | VARCHAR2(32) | 20191231                                                                            |
| :4   |        4 | VARCHAR2(32) | H                                                                                   |
| :5   |        5 | NUMBER       | 201                                                                                 |
| :6   |        6 | VARCHAR2(32) | H                                                                                   |
| :7   |        7 | VARCHAR2(32) | 20191231                                                                            |
========================================================================================================================Global Stats
===================================================================
| Elapsed |   Cpu   |    IO    |  Other   | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) | Waits(s) |  Gets  | Reqs | Bytes |
===================================================================
|     108 |      57 |     0.07 |       51 |    43M |   40 | 320KB |
===================================================================SQL Plan Monitoring Details (Plan Hash Value=2193660895)
======================================================================================================================================================
| Id |               Operation                |      Name      |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Activity | Activity Detail |
|    |                                        |                | (Estim) |      | Active(s) | Active |       | (Actual) |   (%)    |   (# samples)   |
======================================================================================================================================================
|  0 | UPDATE STATEMENT                       |                |         |      |           |        |     1 |          |          |                 |
|  1 |   UPDATE                               | GLA_GLIS_H     |         |      |       106 |     +3 |     1 |        0 |    20.37 | Cpu (22)        |
|  2 |    PARTITION RANGE SINGLE              |                |   23106 |  900 |        99 |    +10 |     1 |     755K |          |                 |
|  3 |     TABLE ACCESS FULL                  | GLA_GLIS_H     |   23106 |  900 |       109 |     +0 |     1 |     755K |     0.93 | Cpu (1)         |
|  4 |    SORT AGGREGATE                      |                |       1 |      |        99 |    +10 |  755K |     755K |          |                 |
|  5 |     PARTITION RANGE ITERATOR           |                |       1 | 1158 |       107 |     +2 |  755K |     755K |     4.63 | Cpu (5)         |
|  6 |      TABLE ACCESS BY LOCAL INDEX ROWID | GLA_GLIS_H     |       1 | 1158 |       102 |     +7 |   13M |     755K |    10.19 | Cpu (11)        |
|  7 |       INDEX RANGE SCAN                 | IDX_GLA_GLIS_H |       1 | 1157 |       108 |     +1 |   13M |     755K |    63.89 | Cpu (69)        |
======================================================================================================================================================

優化結果前后對比:

原先主鍵索引對比:
加索引前:4520s(未完成)
加索引后:108s


墨天輪從樂知樂享的數據庫技術社區蓄勢出發,全面升級,提供多類型數據庫管理服務。墨天輪數據庫管理服務旨在為用戶構建信賴可托付的數據庫環境,并為數據庫廠商提供中立的生態支持。

服務官網:https://www.modb.pro/service

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82897.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

$3 #12階段三小結Java se

$3 #12 階段三小結 Java se 基本沒有新學什么知識點 感覺 基礎語法 和高級語法 已經學完了 現在就是得學習 一些企業開發的框架 以及項目架構的思維 比如一個產品 從需求分析 到功能模塊設計 到接口文檔定義 數據庫建立 前端接口頁面設計 后端接口開發的步驟 然后現在比…

華為云Flexus+DeepSeek征文 | 初探華為云ModelArts Studio:部署DeepSeek-V3/R1商用服務的詳細步驟

華為云FlexusDeepSeek征文 | 初探華為云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服務的詳細步驟 前言一、華為云ModelArts Studio平臺介紹1.1 ModelArts Studio介紹1.2 ModelArts Studio主要特點1.3 ModelArts Studio使用場景1.4 ModelArts Studio產品架構 二、訪問…

易經六十四卦象解釋數據集分享!智能體知識庫收集~

今天給大家分享一個易經六十四卦象解釋數據集 &#xff0c;繼續來積累AI相關的資料。 六十四卦&#xff0c;記載于《易經》&#xff0c;每一卦的圖像均由兩個八卦上下組合而成&#xff0c;每一卦各有六個爻。南宋朱熹說&#xff0c;先畫八卦于內&#xff0c;后畫八卦于外&#…

1 μs = 10?? s

1 s 10? s 1 ms 10? s 1 s 10?? s 1 ns 10?? s 1 ps 10? s 1 fs 10?? s ?? 時間單位&#xff08;十進制&#xff09; 符號單位名稱10 的冪次s秒&#xff08;second&#xff09;10?ms毫秒&#xff08;millisecond&#xff09;10?s微秒&#xff08;microseco…

webrtc初了解

1. webrtc的簡介 一、WebRTC 是什么&#xff1f; Web Real-Time Communication&#xff08;網頁實時通信&#xff09;&#xff0c;是瀏覽器原生支持的實時音視頻通信技術&#xff0c;無需安裝插件或客戶端&#xff0c;可直接在瀏覽器之間實現點對點&#xff08;P2P&#xff09…

從數據持久化到網絡通信與OpenCV:Qt應用程序開發的深度探索與實戰

文章目錄 前言一、QSettings&#xff1a;輕量級數據持久化方案1.1 QSettings 主要特點1.2 QSettings 常用函數整理 二、數據庫2.1 連接SQLite數據庫2.2 建表2.3 增刪改 三、網絡編程3.1 網絡分層3.2 IP地址3.3 端口號3.4 基于TCP的Socket通信3.4 相關接口3.4.1核心類3.4.2 通信…

經典SQL查詢問題的練習第一天

首先有三張表&#xff0c;學生表、課程表、成績表 student:studentId,studentName; course:courseId&#xff0c;courseName,teacher; score:score,studentId,courseId; 接著有以下幾道題目&#xff1a; ①查詢課程編號為‘0006’的總成績&#xff1a; 首先總成績&#x…

企業級網絡管理實戰:Linux、云與容器的深度融合與優化

在數字化轉型浪潮下&#xff0c;企業網絡架構日益復雜&#xff0c;Linux系統、云計算與容器技術成為構建高效、靈活網絡的核心要素。本文將從技術原理、實踐方案、優化策略三個維度&#xff0c;深度解析企業級網絡管理中的關鍵技術&#xff0c;助力企業打造穩定、安全、可擴展的…

信號與系統速成-1.緒論

b站浙大教授雖然講的比較細&#xff0c;但是太慢了&#xff0c;不適合速成 祖師爺奧本海姆的MIT課程好像和我們教材的版本不太匹配&#xff0c;但是講的很不錯 慕課上也有很多資源&#xff0c;比如信號與系統 - 網易云課堂 同站博主籬笆外的xixi的文章也挺不錯 最終我還是選…

緩存架構方案:Caffeine + Redis 雙層緩存架構深度解析

在高并發、低延遲的現代互聯網系統中&#xff0c;緩存是提升系統性能和穩定性的重要手段。隨著業務復雜度的增長&#xff0c;單一緩存方案&#xff08;如僅使用Redis或僅使用本地緩存&#xff09;已難以滿足高性能與一致性需求。 本文將圍繞 Caffeine Redis 的雙層緩存架構展…

【Elasticsearch】track_total_hits

在 Elasticsearch 中&#xff0c;track_total_hits 是一個查詢參數&#xff0c;用于控制是否精確計算搜索結果的總命中數&#xff08;total hits&#xff09;。默認情況下&#xff0c;Elasticsearch 在某些情況下可能會對總命中數進行近似計算&#xff0c;以提高性能。track_to…

智能手機上用Termux安裝php+Nginx

Termux的官方網站&#xff1a;Termux | The main termux site and help pages. 以下是在 Termux 上安裝和配置 PHP Nginx 的完整流程總結&#xff0c;包含關鍵步驟和命令&#xff1a; 一、安裝依賴 pkg update && pkg upgrade # 更新包列表和系統pkg install nginx p…

電腦開機后出現bootmgr is conmpressed原因及解決方法

最近有網友問我為什么我電腦開機后出現BOOTMGR is compressed&#xff0c;這個提示意思是:意思是啟動管理器被壓縮了&#xff0c;即使重啟也無法正常進入系統。原因有很多&#xff0c;大部分是引導出現問題&#xff0c;或選錯了啟動硬盤所導致的&#xff0c;下面我們來詳細分析…

服務發現Nacos

目錄 Nacos server 安裝 注冊服務到Nacos server 接口訪問Nacos server中的已注冊服務 Nacos控制臺介紹 Nacos:一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。 在分布式服務應用中&#xff0c;各類服務需要統一的注冊、統一的管理&#xff0c;這個組件工具…

并查集 c++函數的值傳遞和引用傳遞 晴神問

目錄 學校的班級個數 手推7個班級&#xff0c;答案17&#xff1f;懷疑人生 破案了&#xff0c;應該是6個班。 破案了&#xff0c;原來寫的是 unionxy(a, b, father); c if兩個數同時為正或為負 簡潔寫法 可以用位運算&#xff1f; c可以這樣賦值嗎&#xff1f;ab2 典型…

Qt Creator快捷鍵合集

前言 QtCreator是一款跨平臺的IDE,專為Qt開發設計,支持C/C++/JS/Python編程,支持設備遠程調試,支持代碼高亮,集成幫助文檔,原生支持cmake和git,確實是一款樸實而又強大的集成開發環境,讓人有種愛不釋手的感覺 編輯 功能快捷鍵復制Ctrl + C粘貼Ctrl + V剪切Ctrl + X代…

docker網絡相關內容詳解

一、docker與k8s 一、Docker 核心解析 1. Docker 定義與架構 本質&#xff1a; 容器化平臺&#xff08;構建容器化應用&#xff09;、進程管理軟件&#xff08;守護進程管理容器生命周期&#xff09;。客戶端&#xff08;docker cli&#xff09;與服務端&#xff08;docker ser…

首發!PPIO派歐云上線DeepSeek-R1-0528-Qwen3-8B蒸餾模型

首發&#xff01;PPIO派歐云上線DeepSeek-R1-0528-Qwen3-8B蒸餾模型 DeepSeek R1 系列的模型更新還在繼續。 繼昨天 PPIO派歐云首發上線 DeepSeek-R1-0528 模型后&#xff0c;今天 PPIO 再次首發 DeepSeek 最新開源的蒸餾模型 DeepSeek-R1-0528-Qwen3-8B。 DeepSeek-R1-0528-Q…

如何用命令行將 PDF 表格轉換為 HTML 表格

本文將介紹如何使用命令行將可填寫的 PDF 表單轉換為 HTML 表單。只需幾行代碼即可完成轉換。將可填寫的 PDF 表單轉換為 HTML 表單后&#xff0c;你可以在網頁上顯示這些表單。本指南使用 FormVu 來演示轉換過程。 使用命令行將可填寫 PDF 表單轉換為 HTML 表單 你可以通過命…

杰發科技AC7840——CSE硬件加密模塊使用(2)

注意&#xff1a; 不要隨便修改主秘鑰&#xff0c;本次跑代碼過程中&#xff0c;對主秘鑰進行修改&#xff0c;導致無法對cse模塊恢復出廠設置 更新秘鑰例程 第2個例程主要是把cse的key加載到cse安全區域中 這里剛看到加載秘鑰并不是直接把明文加載到cse模塊 測試第3個例程 復…