ORACLE 查詢SQL優化

1 使用EXPLAIN PLAN

????????使用EXPLAIN PLAN查看查詢的執行計劃,這可以幫助你理解查詢是如何被Oracle執行的。基于執行計劃,你可以確定是否存在索引缺失、不必要的全表掃描等問題。

????????以下是幾種使用EXPLAIN PLAN的方法:

? ? ? ? ?使用EXPLAIN PLAN FOR:

????????你可以在SQL*Plus、SQL Developer或其他Oracle工具中運行以下命令:

EXPLAIN PLAN FOR SELECT * FROM your_table WHERE your_column = 'some_value';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

????????第一條命令為指定的SQL查詢生成執行計劃,但它不會直接顯示結果。第二條命令使用DBMS_XPLAN.DISPLAY來格式化并顯示執行計劃。

????????格式化執行計劃輸出:

????????使用DBMS_XPLAN.DISPLAY時,你可以使用各種選項來格式化輸出。例如,要顯示詳細的執行計劃并包括統計信息,你可以這樣做:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(FORMAT=>'ALLSTATS PREDICATE LAST COST'));

????????這將顯示執行計劃的每個步驟,包括它們的成本、估計的行數、使用的索引等。

FORMAT還有一些附加的選項可用于定制化輸出行為,使用中可以通過逗號和空格分隔來聲明多個關鍵字,同時可以使用”+”和”-”符號來包含或排除相應的顯示元素,這些附加的選項在官方文檔中可以查到:

1.ROWS – 顯示被優化器估算的記錄的行號
2.BYTES – 顯示優化器估算的字節數
3.COST – 顯示優化器計算的成本信息
4.PARTITION – 顯示分區的分割信息
5.PARALLEL – 顯示并行執行信息
6.PREDICATE – 顯示謂語
7.PROJECTION – 顯示列投影部分(每一行的那些列被傳遞給其父列已經這些列的大小)
8.ALIAS – 顯示查詢塊名稱已經對象別名
9.REMOTE – 顯示分布式查詢信息
10.NOTE – 顯示注釋
11.IOSTATS – 顯示游標執行的IO統計信息
12.MEMSTATS – 為內存密集運算如散列聯結,排序,或一些類型的位圖運算顯示內存管理統計信息
13.ALLSTATS – 與'IOSTATS MEMSTATS'等價
14.LAST – 顯示最后執行的執行計劃統計信息,默認顯示為ALL類型,并且可以累積。

????????查看特定SQL ID的執行計劃:

????????如果你知道SQL語句的SQL ID(通常可以在AWR報告或V$SQL視圖中找到),你可以使用DBMS_XPLAN.DISPLAY_CURSOR來查看其執行計劃:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('your_sql_id', 'ALLSTATS'));

????????請注意替換'your_sql_id'為你想要查看的SQL語句的ID。

????????清除之前的執行計劃:

????????如果你之前為多個查詢生成了執行計劃,并希望清除它們以便為新的查詢生成執行計劃,你可以使用以下命令:

EXECUTE DBMS_XPLAN.CLEAR_PLAN_TABLE();

????????這將清除PLAN_TABLE$(存儲執行計劃的地方)中的內容。注意,這可能會影響到其他會話中正在查看的執行計劃。

????????在SQL*Plus中使用AUTOTRACE:

????????在SQL*Plus中,你可以使用SET AUTOTRACE ON來自動顯示查詢的執行計劃:

SET AUTOTRACE ON

EXPLAIN SELECT * FROM your_table WHERE your_column = 'some_value';

????????這將執行查詢并顯示其執行計劃。

????????使用SQL Developer等圖形化執行計劃

????????如果你使用Oracle SQL Developer,你可以直接點擊查詢結果上方的“執行計劃”選項卡來查看圖形化的執行計劃(或者快捷鍵,如PL/SQL快捷鍵為“F5”)。SQL Developer會自動為你生成并顯示執行計劃。????????

2 索引優化

  • 確保在經常用于搜索、排序和連接的列上創建了索引。
  • 避免在索引列上使用函數或表達式,這可能導致索引失效。
  • 定期審查和維護索引,刪除不必要的索引,因為索引也會占用存儲空間并影響插入、更新和刪除操作的性能。
  • 多表查詢關聯時,關聯條件字段數據類型不一致時,可能會導致索引失效,盡量保證關聯的索引字段數據類型保持一致。

3 SQL語句優化

  • 盡量減少SELECT語句中選擇的列數,只選擇需要的列。
  • 使用IN代替多個OR條件。
  • 使用連接(JOIN)代替子查詢,當可能時。
  • 避免在WHERE子句中使用非SARGable(Search ARGumentable)表達式,這些表達式不能有效地利用索引。
  • 避免SELECT *,使用SELECT*?會返回表中的所有列,這可能會消耗更多的I/O資源。只選擇需要的列。

  • 通過創建適當的索引和優化查詢來減少全表掃描。

  • 對于大型查詢,考慮使用Oracle的并行查詢功能來加速查詢的執行。這可以在多個CPU或磁盤上并行處理查詢。

  • 當用到子查詢時,子查詢中的查詢條件最好使用主查詢中結果集最少的表,避免大結果集匹配子查詢;當可能時,可在條件中加入 rownum=1,如:

    --使用
    select (select itable.col0 from itable where itable.col1 = table1.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--不使用
    select (select itable.col0 from itable where itable.col1 = table2.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--使用
    select (select itable.col0from itablewhere itable.col1 = table1.col1and rownum = 1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--不使用
    select (select itable.col0 from itable where itable.col1 = table1.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;
    

4 分區

????????對于非常大的表,考慮使用分區來提高查詢性能。分區允許你將數據分成更小的、更易于管理的片段,每個片段可以獨立存儲、備份和索引。


Oracle提供了多種分區方法,包括范圍分區、列表分區、散列分區和復合分區等。以下是各種分區方法的簡要說明:

  1. 范圍分區:根據表中某個列的值的范圍將數據劃分為不同的分區。例如,可以根據日期范圍將銷售數據劃分為不同的季度或年份分區。

    • 優點:適用于可以按自然范圍進行分區的表,如時間序列數據。
    • 示例:PARTITION BY RANGE (sales_date) (PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')))
  2. 列表分區:明確指定要包含在特定分區中的值的列表。與范圍分區不同,列表分區支持基于非連續或不規則的值進行分區。

    • 優點:適用于需要明確控制行如何映射到分區的場景。
    • 示例:PARTITION BY LIST (region) (PARTITION reg1 VALUES ('North', 'South'), PARTITION reg2 VALUES ('East', 'West'))
  3. 散列分區:根據指定的散列函數將數據均勻地分布到不同的分區中。這通常用于確保數據的均勻分布和負載平衡。

    • 優點:自動將數據均勻分布到不同的分區中,無需手動指定范圍或值。
    • 示例:PARTITION BY HASH (employee_id) (PARTITIONS 4)
  4. 復合分區:結合使用范圍分區和列表分區或散列分區的方法。通常首先使用范圍分區將數據劃分為較大的邏輯部分,然后在每個范圍內使用列表或散列分區進行更細粒度的劃分。

    • 優點:結合了范圍分區和列表/散列分區的優點,提供了更靈活的數據劃分方式。

如何對已有表進行分區

對于已經存在的表,Oracle提供了在線重定義表的功能來將其轉換為分區表。這通常涉及創建一個新的分區表,然后將原始表的數據復制到新表中,并重新命名或刪除原始表。這個過程可以在數據庫正常運行時進行,但可能需要一些時間和資源。

查詢分區信息

可以使用Oracle提供的數據字典視圖(如DBA_TAB_PARTITIONSUSER_TAB_PARTITIONS等)來查詢有關分區表的信息,包括分區的名稱、大小、存儲參數等。


5 數據庫統計信息

????????確保定期收集表和索引的統計信息,因為Oracle優化器使用這些統計信息來選擇最佳的執行計劃。

6 使用綁定變量

????????在PL/SQL代碼或JDBC/ODBC等接口中,使用綁定變量而不是硬編碼值,這可以減少硬解析的數量,并提高性能。

7 使用Oracle的SQL調優顧問

????????Oracle提供了SQL調優顧問(SQL Tuning Advisor),它可以分析SQL語句并提供可能的優化建議。

8 考慮物化視圖

????????對于復雜的查詢或聚合操作,考慮使用物化視圖來存儲預計算的結果。這可以加快查詢速度,但請注意,物化視圖需要定期刷新以保持數據的準確性。

硬件和配置優化

????????確保數據庫服務器具有足夠的RAM、CPU和磁盤I/O資源。此外,檢查Oracle的配置參數,如SGA(系統全局區)的大小,以確保它們已針對你的工作負載進行了優化。

定期維護

????????定期運行數據庫維護任務,如重新構建索引、更新統計信息、清理碎片化的數據等,以保持數據庫的最佳性能。

監控和診斷

????????使用Oracle的性能監控工具(如AWR、ASH、ADDM等)來監控數據庫的性能并診斷潛在的問題。這些工具可以提供關于查詢性能、等待事件、資源消耗等方面的詳細信息。

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

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

相關文章

【Epoch,Batch,Iteration】深度學習模型訓練相關基礎概念光速理解!

🔥模型訓練相關基礎概念! Epoch: 一次 epoch 代表整個訓練數據集已經被完整地送入神經網絡進行了一輪訓練。通常,模型需要多次 epoch 才能充分學習數據集中的模式。Batch: 由于數據集可能過大,無法一次性全部加載到內存中進行訓練…

解決VSCode右鍵沒有Open In Default Browser問題

在VSCode進行Web小程序測試時,我們在新建的HTML文件中輸入 !會自動生成頁面代碼骨架,寫入內容后,我們想要右鍵在瀏覽器中預覽。發現右鍵沒有“Open In Default Browser”選項。原因是沒有安裝插件。 下面是解決方案:首先在VSCode找…

探索Lora:微調大型語言模型和擴散模型的低秩適配方法【原理解析,清晰簡潔易懂!附代碼】

探索Lora:微調大型語言模型和擴散模型的低秩適配方法 隨著深度學習技術的快速發展,大型語言模型(LLMs)和擴散模型(Diffusion Models)在自然語言處理和計算機視覺領域取得了顯著的成果。然而,這…

3d渲染的常用概念和技術,渲染100邀請碼1a12

之前我們介紹了3D渲染的基本原理和流程,這次說下幾個常用概念和技術。 3D渲染中涉及到很多專業的概念和技術,它們決定了渲染質量和效果,常用的有以下幾個。1、光線追蹤 光線追蹤是一些專業渲染器(如V-Ray和Corona等)…

Android UI控件詳細解析(四)

1.UI控件 1.1 TextView控件 常用屬性 屬性含義id給當前控件定義了一個唯 一標識符layout_width高度,單位:dp (wrap_content, match_parent)layout_height寬度,單位:dp (wrap_content, match_parent)background設置背景圖片text…

Django學習一:創建Django框架,介紹Django的項目結構和開發邏輯。創建應用,編寫主包和應用中的helloworld

文章目錄 前言一、Django環境配置1、python 環境2、Django環境3、mysql環境4、IDE:pycharm 二、第一次創建Django項目1、創建項目door_web_django_system2、運行啟動 三、Django項目介紹1、介紹Django項目結構2、第一個helloword4、django的項目邏輯(和j…

React + Taro 項目 實際書寫 感受

之前我總結了部分react 基礎 根據官網的內容 以及Taro 框架的內容 今天我試著開始寫了一下頁面和開發 說一下我的感受 我之前寫的是vue3 今天是第一次真正根據需求做頁面開發 和邏輯功能 代碼的書寫 主體就是開發了這個頁面 雖說這個頁面 很簡單 但是如果你要是第一次寫 難說…

CATIA入門操作案例——壓縮彈簧繪制,螺旋線的使用,法則曲線應用

目錄 引出畫壓縮彈簧畫等距部分畫兩端的壓縮部分曲線縫合和掃掠封閉曲面得實體 總結異形彈簧新建幾何體草圖編輯,畫一條樣條線進行掃掠,圓心和半徑畫出曲面上的螺旋線再次選擇掃掠,圓心和半徑 其他自定義信號和槽1.自定義信號2.自定義槽3.建立…

Aigtek功率放大器的主要性能要求有哪些

功率放大器是電子系統中的重要組件,用于將低功率信號放大到高功率水平。功率放大器的性能直接影響到信號的放大質量和系統的整體性能。下面西安安泰將介紹功率放大器的主要性能要求。 增益:功率放大器應當具有足夠的增益,即將輸入信號的幅度放…

【仿真建模-anylogic】指定服務端口

Author:趙志乾 Date:2024-05-31 Declaration:All Right Reserved!!! 問題:anylogic動畫模型可以在瀏覽器中進行展示,且訪問端口在模型啟動時隨機生成;為了將其動畫頁面嵌…

讀取YUV數據到AVFrame并用多線程控制幀率

文件樹: 1.xvideo_view.h class XVideoView { public:// 像素格式枚舉enum Format { RGBA 0, ARGB, YUV420P };// 渲染類型枚舉enum RenderType { SDL 0 };// 創建渲染對象的靜態方法static XVideoView* Create(RenderType type SDL);// 繪制幀的方法bool DrawF…

影響生產RAG流水線5大瓶頸

檢索增強生成(Retrieval Augmented Generation,RAG)已成為基于大型語言模型的生成式人工智能應用的關鍵組成部分。其主要目標是通過將通用語言模型與外部信息檢索系統集成,增強通用語言模型的能力。這種混合方法旨在解決傳統語言模…

無法刪除dll文件

碰到xxxxxx.dll文件無法刪除不要慌! 通過Tasklist /m dll文件名稱 去查看它和哪個系統文件綁定運行,發現是explorer.exe。 我們如果直接通過del命令【當然需要在該dll文件所在的路徑中】。發現拒絕訪問 我們需要在任務管理器中,將資源管理器…

如何處理網安發出的網絡安全監督檢查限期整改通知

近期,很多客戶都收到了網安發出的限期整改通知。大家都比較關心的問題是,如何應對處理這些限期整改通知。后續是否有其他的影響,需要如何做進一步的優化整改和調整。今天就這些問題給大家做一些分享。 一. 為什么會有網安的網絡安全檢查 主…

大多數JAVA程序員都干不到35歲嗎?

在開始前剛好我有一些資料,是我根據網友給的問題精心整理了一份「 Java的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家!!!不少人認為的程序員吃青春飯…

邊緣計算:推動智能時代的前沿技術

邊緣計算:推動智能時代的前沿技術 引言 隨著物聯網(IoT)、5G通信和人工智能(AI)技術的迅猛發展,邊緣計算(Edge Computing)成為現代計算架構中的一個重要組成部分。邊緣計算通過將數據處理和存儲移至網絡邊緣,靠近數據生成源頭,從而顯著提高響應速度、降低延遲和帶寬…

項目VS運營

一、項目與運營的定義與區別 項目與運營是企業管理中的兩個重要概念,盡管在實際運作中它們常被視為同義詞,但它們之間存在明顯的區別。 項目,指的是為達到特定目標,通過臨時性、系統性、有計劃的組織、協調、控制等系列活動&…

基于深度學習的端到端語音識別時代

隨著深度學習的發展,語音識別由DNN-HMM時代發展到基于深度學習的“端到端”時代,這個時代的主要特征是代價函數發生了變化,但基本的模型結構并沒有太大變化。總體來說,端到端技術解決了輸入序列長度遠大于輸出序列長度的問題。 采…

Visual Studio中調試信息格式參數:/Z7、/Zi、/ZI參數

一般的調試信息都保存在pdb文件中。 Z7參數表示這些調試信息保存到OBJ目標文件中,這樣的好處是不需要單獨分發PDB文件給下游。Zi就是把所有的調試信息都保存在pdb文件中,以縮小發布文件的大小。ZI和Zi類似,但是增加了熱重載的能力&#xff1…

Django admin后臺創建密文密碼

Django admin后臺創建密文密碼 如題現在有一張用戶表User # user/models.py from django.db import models from django.contrib.auth.models import AbstractUserclass User(AbstractUser):SEX_CHOICES [(0, 男),(1, 女),]sex models.IntegerField(choicesSEX_CHOICES, de…