【SQL優化案例】索引創建不合理導致SQL消耗大量CPU資源

#隱式轉換?

第一章 適用環境

  • oracle 11g+
  • linux 6.9+

第二章 Top SQL概況

下面列出我們發現的特定模塊中Top SQL的相關情況:

SQL_ID

模塊

SQL類型

主要問題

fnc58puaqkd1n

select

索引創建不合理,導致全索引掃描,產生了大量邏輯讀

第三章 SQL優化方案

3.1 SQL_ID:fnc58puaqkd1n

3.1.1 SQL文本

SELECT MAX(TEST_ID) TEST_ID FROM TEST1 WHERE TEST_NAME = 28                                                

3.1.2 SQL執行計劃

PLAN_TABLE_OUTPUT                                                                                                                                                                                       
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  fnc58puaqkd1n, child number 0                                                                                                                                                                   
-------------------------------------                                                                                                                                                                   
SELECT MAX(TEST_ID) TEST_ID FROM TEST1 WHERE TEST_NAME = 28                                                                                                                                     Plan hash value: 2527920730                                                                                                                                                                             ---------------------------------------------------------------------------------------------------                                                                                                     
| Id  | Operation             | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                     
---------------------------------------------------------------------------------------------------                                                                                                     
|   0 | SELECT STATEMENT      |                           |       |       | 23200 (100)|          |                                                                                                     
|   1 |  SORT AGGREGATE       |                           |     1 |    13 |            |          |                                                                                                     
|*  2 |   INDEX FAST FULL SCAN| TEST1_TEST_ID_IDX         |     1 |    13 | 23200   (3)| 00:04:39 |                                                                                                     
---------------------------------------------------------------------------------------------------                                                                                                     Predicate Information (identified by operation id):                                                                                                                                                     
---------------------------------------------------                                                                                                                                                     2 - filter(TO_NUMBER("TEST_NAME")=28)     

3.1.3 SQL資源消耗

            CPU(MS)  ELA(MS)     DISK          GET        ROWS      ROWS APPLI(MS) CONCUR(MS) CLUSTER(MS) USER_IO(MS)    PLSQL     JAVA                                                                 
EXEC       PRE EXEC PRE EXEC PRE EXEC     PRE EXEC    PRE EXEC PRE FETCH  PER EXEC   PER EXEC    PER EXEC    PER EXEC PER EXEC PER EXEC SQL_PROFILE                                                     
---------- -------- -------- -------- ------------ ----------- --------- --------- ---------- ----------- ----------- -------- -------- ---------------                                                 
2887          2,116    2,146        0       89,108           1         1         0          0           0           0        0        0                                                                 

該SQL執行了2887次,每次執行的平均邏輯讀為89,108,物理讀為0,每次返回1條數據,耗時2.146秒,其中CPU消耗2.116秒。

四、 問題分析及優化思路

通過分析SQL文本,發現該SQL為單表掃描類型,select涉及max函數。

通過分析執行計劃,SQL主要性能消耗在TEST1_TEST_ID_IDX 的全索引掃描,該索引的體積達到705MB,由于該SQL執行頻率高達2887次,等待主要在CPU上,這就是該SQL執行耗時只有2秒原因。

那為什么會導致該SQL走的是快速索引全掃描,而不是索引范圍掃描?觀察到執行計劃中有一個隱式轉換,是它的原因嗎?通過測試發現并不是。那問題在哪?

再看下TEST1_TEST_ID_IDX組成列的順序是TEST_ID、TEST_NAME,而SQL的過濾條件是TEST_NAME,針對TEST_ID算MAX值,到這里問題就清楚了,索引創建的順序有問題,前導列應該是TEST_NAME,正確的索引創建順序應該是TEST_NAME、TEST_ID,讓執行計劃走MAX/MIN類型。

另外還有一個問題,該SQL存在隱式轉換,觀察到TEST_NAME字段類型是varchar2,而SQL傳值類型是數值,如果不消除這個問題,有正確的索引仍然無法走最優的執行計劃。

結合以上分析,該SQL需要消除隱式轉換,再創建合適的索引即可優化。

五、 優化方案

5.1 創建組合索引

CREATE INDEX "TESTUSER"."TEST1_N1" ON "TESTUSER"."TEST1" (TEST_NAME,TEST_ID) tablespace TESTUSER_IDX  online;

5.2 查看索引效果

SQL> SELECT MAX(TEST_ID) TEST_ID FROM TESTUSER.TEST1 WHERE TEST_NAME = 28;Execution Plan
----------------------------------------------------------
Plan hash value: 3698544155------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    13 | 13251   (3)| 00:02:40 |
|   1 |  SORT AGGREGATE       |                  |     1 |    13 |            |          |
|*  2 |   INDEX FAST FULL SCAN| TEST1_N1         |  1075K|    13M| 13251   (3)| 00:02:40 |
------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - filter(TO_NUMBER("TEST_NAME")=28)

觀察仍然走的TEST1_N1索引INDEX FAST FULL SCAN。有兩種方案可以解決,一是創建函數索引,二是修改傳參類型,這里我們選擇改傳參類型。

5.3 優化后的效果

SQL> SELECT MAX(TEST_ID) TEST_ID FROM TESTUSER.TEST1 WHERE TEST_NAME = '28';Execution Plan
----------------------------------------------------------
Plan hash value: 1923666499-------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                  |     1 |    13 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE              |                  |     1 |    13 |            |          |
|   2 |   FIRST ROW                  |                  |     1 |    13 |     3   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN (MIN/MAX)| TEST1_N1         |     1 |    13 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------3 - access("TEST_NAME"='28')

六、 優化效果對比

通過確認關鍵表數據量,制定執行計劃,可以減少每次查詢的邏輯讀和物理讀,提高SQL執行性能。

邏輯讀

物理讀

執行時間(s)

優化前

89,108

0

2.3

優化后

3

0

0.01


🚀 更多數據庫干貨,歡迎關注【安呀智數據坊】

如果你覺得這篇文章對你有幫助,歡迎點贊 👍、收藏 ? 和留言 💬 交流,讓我知道你還想了解哪些數據庫知識!

📬 想系統學習更多數據庫實戰案例與技術指南?

📊 實戰項目分享

📚 技術原理講解

🧠 數據庫架構思維

🛠 工具推薦與實用技巧

立即關注,持續更新中 👇

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

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

相關文章

autoas/as 工程的RTE靜態消息總線實現與端口數據交換機制詳解

0. 概述 autoas/as 工程的RTE(Runtime Environment)通過自動生成C代碼,將各SWC(軟件組件)之間的數據通信全部靜態化、結構化,實現了類似“靜態消息總線”的通信模型。所有端口的數據交換都必須經過RTE接口…

【機器學習第四期(Python)】LightGBM 方法原理詳解

LightGBM 概述 一、LightGBM 簡介二、LightGBM 原理詳解?? 核心原理🧠 LightGBM 的主要特點 三、LightGBM 實現步驟(Python)🧪 可調參數推薦完整案例代碼(回歸任務 可視化) 參考 LightGBM 是由微軟開源的…

時序數據庫IoTDB監控指標采集與可視化指南

一、概述 本文以時序數據庫IoTDB V1.0.1版本為例,介紹如何通過Prometheus采集Apache IoTDB的監控指標,并使用Grafana進行可視化。 二、Prometheus聚合運算符 Prometheus支持多種聚合運算符,用于在時間序列數據上進行聚合操作。以下是一些常…

React安裝使用教程

一、React 簡介 React 是由 Facebook 開發和維護的一個用于構建用戶界面的 JavaScript 庫,適用于構建復雜的單頁應用(SPA)。它采用組件化、虛擬 DOM 和聲明式編程等理念,已成為前端開發的主流選擇。 二、React 安裝方式 2.1 使用…

.NET MAUI跨平臺串口通訊方案

文章目錄 MAUI項目架構設計平臺特定實現接口定義Windows平臺實現Android平臺實現 MAUI主界面實現依賴注入配置相關學習資源.NET MAUI開發移動端開發平臺特定實現依賴注入與架構移動應用發布跨平臺開發最佳實踐性能優化測試與調試開源項目參考 MAUI項目架構設計 #mermaid-svg-OG…

BUUCTF在線評測-練習場-WebCTF習題[MRCTF2020]你傳你[特殊字符]呢1-flag獲取、解析

解題思路 打開靶場&#xff0c;左邊是艾克&#xff0c;右邊是詩人&#xff0c;下面有個文件上傳按鈕 結合題目&#xff0c;是一個文件上傳漏洞&#xff0c;一鍵去世看源碼可知是提交按鈕&#xff0c;先上傳個一句話木馬.php試試 <?php eval($_POST[shell]); ?> 被過…

【容器】容器平臺初探 - k8s整體架構

目錄 K8s總攬 K8s主要組件 組件說明 一、Master組件 二、WokerNode組件 K8s是Kubernetes的簡稱&#xff0c;它是Google的開源容器集群管理系統&#xff0c;其提供應用部署、維護、擴展機制等功能&#xff0c;利用k8s能很方便地管理跨機器運行容器化的應用。 K8s總攬 K8s主…

C++--繼承

文章目錄 繼承1. 繼承的概念及定義1.1 繼承的概念1.2 繼承的定義1.2.1 定義格式1.2.2 繼承方式和訪問限定符1.2.3 繼承基類成員訪問方式的變化1.2.3.1 基類成員訪問方式的變化規則1.2.3.2 默認繼承方式 1.3 繼承類模版 2. 基類和派生類的轉化3. 繼承中的作用域3.1 隱藏3.2 經典…

無REPOSITORY、TAG的docker懸空鏡像究竟是什么?是否可刪除?

有時候&#xff0c;使用docker images指令我們可以發現大量的無REPOSITORY、TAG的docker鏡像&#xff0c;這些鏡像究竟是什么&#xff1f; 它們沒有REPOSITORY、TAG名稱&#xff0c;沒有辦法引用&#xff0c;那么它們還有什么用&#xff1f; [rootcdh-100 data]# docker image…

創建一個基于YOLOv8+PyQt界面的駕駛員疲勞駕駛檢測系統 實現對駕駛員疲勞狀態的打哈欠檢測,頭部下垂 疲勞眼睛檢測識別

如何使用Yolov8創建一個基于YOLOv8的駕駛員疲勞駕駛檢測系統 文章目錄 1. 數據集準備2. 安裝依賴3. 創建PyQt界面4. 模型訓練1. 數據集準備2. 模型訓練數據集配置文件 (data.yaml)訓練腳本 (train.py) 3. PyQt界面開發主程序 (MainProgram.py) 4. 運行項目5. 關鍵代碼解釋數據集…

使用FFmpeg將YUV編碼為H.264并封裝為MP4,通過api接口實現

YUV數據來源 攝像頭直接采集的原始視頻流通常為YUV格式&#xff08;如YUV420&#xff09;&#xff0c;尤其是安防攝像頭和網絡攝像頭智能手機、平板電腦的攝像頭通過硬件接口視頻會議軟件&#xff08;如Zoom、騰訊會議&#xff09;從攝像頭捕獲YUV幀&#xff0c;進行預處理&am…

tcpdump工具交叉編譯

本文默認系統已經安裝了交叉工具鏈環境。 下載相關版本源碼 涉及tcpdump源碼&#xff0c;以及tcpdump編譯過程依賴的pcap庫源碼。 網站&#xff1a;http://www.tcpdump.org/release wget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz wget http://www.tcpdump.org/r…

神經網絡中torch.nn的使用

卷積層 通過卷積核&#xff08;濾波器&#xff09;在輸入數據上滑動&#xff0c;卷積層能夠自動檢測和提取局部特征&#xff0c;如邊緣、紋理、顏色等。不同的卷積核可以捕捉不同類型的特征。 nn.conv2d() in_channels:輸入的通道數&#xff0c;彩色圖片一般為3通道 out_c…

在MATLAB中使用GPU加速計算及多GPU配置

文章目錄 在MATLAB中使用GPU加速計算及多GPU配置一、基本GPU加速使用1. 檢查GPU可用性2. 將數據傳輸到GPU3. 執行GPU計算 二、多GPU配置與使用1. 選擇特定GPU設備2. 并行計算工具箱中的多GPU支持3. 數據并行處理&#xff08;適用于深度學習&#xff09; 三、高級技巧1. 異步計算…

【unitrix】 4.12 通用2D仿射變換矩陣(matrix/types.rs)

一、源碼 這段代碼定義了一個通用的2D仿射變換矩陣結構&#xff0c;可用于表示二維空間中的各種線性變換。 /// 通用2D仿射變換矩陣&#xff08;元素僅需實現Copy trait&#xff09; /// /// 該矩陣可用于表示二維空間中的任意仿射變換&#xff0c;支持以下應用場景&#xff…

android RecyclerView隱藏整個Item后,該Item還占位留白問題

前言 android RecyclerView隱藏整個Item后,該Item還占位留白問題 思考了利用隱藏和現實來控制item 結果實現不了方案 解決方案 要依據 model 的第三個參數&#xff08;布爾值&#xff09;決定是否保留數據&#xff0c;可以通過 ?filter 高階函數結合 ?空安全操作符? 實…

地圖瓦片介紹與地圖瓦片編程下載

前沿 地圖瓦片指將一定范圍內的地圖按照一定的尺寸和格式&#xff0c;按縮放級別或者比例尺&#xff0c;切成若干行和列的正方形柵格圖片&#xff0c;對切片后的正方形柵格圖片被形象的稱為瓦片[。瓦片通常應用于B/S軟件架構下&#xff0c;瀏覽器從服務器獲取地圖數據&#xf…

手機屏亮點缺陷修復及相關液晶線路激光修復原理

摘要 手機屏亮點缺陷嚴重影響顯示品質&#xff0c;液晶線路短路、電壓異常是導致亮點的關鍵因素。激光修復技術憑借高能量密度與精準操控性&#xff0c;可有效修復液晶線路故障&#xff0c;消除亮點缺陷。本文分析亮點缺陷成因&#xff0c;深入探究液晶線路激光修復原理、工藝…

MySQL數據一鍵同步至ClickHouse數據庫

隨著數據量的爆炸式增長和業務場景的多樣化&#xff0c;傳統數據庫系統如MySQL雖然穩定可靠&#xff0c;但在海量數據分析場景下逐漸顯露出性能瓶頸。這時&#xff0c;ClickHouse憑借其列式存儲架構和卓越的OLAP&#xff08;在線分析處理&#xff09;能力脫穎而出&#xff0c;成…

Android中Compose常用組件以及布局使用方法

一、基礎控件詳解 1. Text - 文本控件 Text(text "Hello Compose", // 必填&#xff0c;顯示文本color Color.Blue, // 文字顏色fontSize 24.sp, // 字體大小&#xff08;注意使用.sp單位&#xff09;fontStyle FontStyle.Italic, // 字體樣式&…