Oracle優化技巧

来源:https://www.cnblogs.com/xiongshx/archive/2018/01/15/8288981.html
-Advertisement-
Play Games

現觀察線上系統運行發現,線上某些業務查詢存在等待時間長問題,後核查發現,部分問題出現在對資料庫操作上Cost大部分時間,後根據網上各位前輩提供的優化技巧解決大部分問題,現寫下本篇文章,一來鞏固加深自己學習的優化技巧,二來方便正在為sql優化迷茫的猿友們提供一下思路和方法,共同進步,一起成長~ 1、現 ...


現觀察線上系統運行發現,線上某些業務查詢存在等待時間長問題,後核查發現,部分問題出現在對資料庫操作上Cost大部分時間,後根據網上各位前輩提供的優化技巧解決大部分問題,現寫下本篇文章,一來鞏固加深自己學習的優化技巧,二來方便正在為sql優化迷茫的猿友們提供一下思路和方法,共同進步,一起成長~

1、現狀描述

sql執行時間長、數據查詢慢

2、問題對象

sql執行語句(特別是多表多條件關聯查詢數據)

3、理論知識

1、Oracle優化器
Oracle優化器:Oracle資料庫中的優化器又叫查詢優化器(QueryOptimizer)。它是SQL分析和執行的優化工具,它負責生成、制定SQL的執行計劃。
    
Oracle優化器優化方式
基於規則的優化方式(Rule-BasedOptimization,簡稱為RBO)
    它根據指定的規則順序,對指定的表進行執行計劃的選擇。它著一套嚴格的使用規則,只要你按照它去寫SQL語句,無論數據表中的
內容怎樣,也不會影響到你的“執行計劃”,也就是說RB對數據不“敏感”。要求開發人員瞭解RBO的各項細則。在ORACLE 
10g中完全被CBO取代。

基於代價的優化方式(Cost-Based Optimization,簡稱為CBO)。
    CBO是一種比RBO更加合理、可靠的優化器,它是從ORACLE 8中開始引入,在ORACLE10g中完全取代RBO。CBO是計算各種可能“執行
計劃”的“代價”,即COST,從中選用COST最低的執行方案,作為實際運行方案。它依賴資料庫對象的統計信息,統計信息的準確與否會影響C
BO做出最優的選擇。如果對一次執行SQL時發現涉及對象(表、索引等)沒有被分析、統計過,那麼ORACLE會採用一種叫做動態採樣的技術,
動態的收集表和索引上的一些數據信息。
2、Oracle索引
Oracle索引是一種供伺服器在表中快速查找一個行的資料庫結構。合理使用索引能夠大大提高資料庫的運行效率。
在Oracle中,索引是一種供伺服器在表中快速查找一個行的資料庫結構。在資料庫中建立索引主要有以下作用。
(1)快速存取數據。
(2)既可以改善資料庫性能,又可以保證列值的唯一性。
(3)實現表與表之間的參照完整性
(4)在使用order by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。
  3、優化方向
a、去掉不必要的大型表的全表掃描
b、去掉不必要的大型表的全表掃描
c、緩存小型表的全表掃描
d、檢驗優化索引的使用
e、檢驗優化的連接技術
f、儘可能減少執行計劃的Cost

4、具體優化方法

1、查詢條件(where後面的子句)優化
避免全表掃描,應考慮在where及order by等列上建立索引,否則將導致進行全表掃描。。

避免在where子句中對欄位進行null值判斷,否則將導致放棄使用索引而進行全表掃描。

避免在where子句中使用!=或<>操作符,否則將導致放棄使用索引而進行全表掃描。

避免用or連接條件,如果有部分欄位存在索引,部分不存在索引,則將導致放棄使用索引而進行全表掃描,建議使用union all代替。

慎用in 和 not in 也要慎用,否則會導致全表掃描。
     使用exists替換in問題
        子查詢結果集小,用IN
        外表小,子查詢表大,用EXISTS
    建議實際選取哪個可以對比兩個sql的執行計劃

應儘量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如: 
SELECT ID FROM T WHERE NUM / 2 = 100
優化為:
SELECT ID FROM T WHERE NUM = 100 * 2

應儘量避免在where子句中對欄位進行函數函數、算術運算或其他表達式運算操作,否則將導致放棄使用索引而進行全表掃描。如:
-- NAME以ABC開頭的ID
SELECT ID FROM T WHERE SUBSTRING(NAME, 1, 3) = ’ABC’ 
--2005-11-30’生成的id
SELECT ID FROM T WHERE DATEDIFF(DAY, CREATEDATE, ’2005 - 11 - 30′) = 0
應改為:
SELECT ID FROM T WHERE NAME LIKE 'abc%'
SELECT ID FROM T WHERE CREATEDATE >= '2005-11-30' AND CREATEDATE < '2005-12-1'
2、對結果進行優化
Update 語句,如果只更改1、2個欄位,不要Update全部欄位,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。

對於多張大數據量(這裡幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

select count(*) from table;這樣不帶任何條件的count會引起全表掃描,並且沒有任何業務意義,是一定要杜絕的。

儘量避免向客戶端返回大數據量,若數據量過大,應該考慮是否使用分頁 
3、其他優化
索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 
update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到
的列上建的索引是否有必要。

應儘可能的避免更新聚集索引(clustered)數據列,因為聚集索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的
順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新集索引數據列,那麼需要考慮是否應將該索引建為聚集索引

儘量使用數字型欄位,若只含數值信息的欄位儘量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢
和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。

儘量使用表變數來代替臨時表。如果表變數包含大量數據,請註意索引非常有限(只有主鍵索引)。

避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重覆引用
大型表或常用表中的某個數據集時。但是,對於一次性事件, 最好使用導出表。

在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 
log,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。

如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table 
,這樣可以避免系統表的較長時間鎖定。

儘量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。

使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所
需的數據時。在結果集中包括“合計”的常式通常要比使用游標執行的速度快。如果開發時 
間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 
。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。

儘量避免大事務操作,提高系統併發能力。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 埠名稱 埠號/協議 別名 ftp 21/tcp Telnet 23/tcp smtp 25/tcp mail nicename 43/tcp whois domain 53/tcp nameserver domain 53/udp nameserver finger 79/tcp http 80 ...
  • awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,ga ...
  • 1、思科設備和微軟系統整合的背景: 公司內部有一定數量的客戶端,為了實現統一化,在管理內部部署了域架構,這樣可以通過組策略對客戶端進行批量化管理,提高了管理的效率。 同樣公司內部有一定數量的網路設備(交換機,路由器,防火牆等),在遠程管理的時候是通過Telnet方式。 在本案例中,希望用戶遠程管理網 ...
  • [譯註]翻譯這篇文章,主要是覺得老外在思考問題時,勇於打破固有的技術棧積累,嘗試不同的選擇,從而找到最合適自己的技術方案、得到真正的實惠。 Synergy SKY提供多種軟體解決方案,本文想討論的是關於一套用於視頻相關的呼叫記錄(CDR)分析解決方案。 為客戶提供方案時有兩種選擇,一是讓客戶避免所有 ...
  • 處理MySQL的ibdata1文件過大問題 本人遇到一次在安裝zabbix監控的時候,yum安裝的MySQL資料庫,後面用了一段時間發現data目錄下的ibdata1的空間特別大,反而我的zabbix資料庫的空間很小,這樣的情況在後面備份zabbix資料庫的時候會很不方便,所以想著要怎麼解決下。 i ...
  • 今天客戶提了一個小需求,希望我能提供一條sql語句,幫助他對數據中 _field 這個欄位的值去重,並且保留其他欄位的數據。第一反應是select distinct,但這種語句在對某個欄位去重時,無法保留其他欄位,所以select distinct不成立。因為用戶對去重沒有要求,欄位值重覆時保留任意 ...
  • 一、簡介 MongoDB是一款強大、靈活、且易於擴展的通用型資料庫 1、易用性 1)MongoDB是一款面向文檔的資料庫,而不是關係型資料庫,因此而有著更好的擴展性。 2)通過在文檔中嵌入文檔和數組,面向文檔的方法能夠僅使用一條記錄來表現複雜的層級關係。 3)MongoDB沒有預定義模式(prede ...
  • 一、新增欄位 alert table user add( userName VARCHAR2(255 CHAR) ) ; 設置欄位不為空, 給出預設值 alert table user add( userName varchar2(255 CHAR) default '這是預設值' not null ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...