1. 程式人生 > >Oracle資料庫優化的總結

Oracle資料庫優化的總結

分析和優化的基本步驟如下:

1、如果是SQL語句的寫法問題,我們可以通過在不更改業務邏輯的情況下改寫SQL來加以解決;

2、如果是不必要的全表掃描/排序而導致了目標SQL的效能問題,我們可以通過建立合適的索引(包括函式索引、點陣圖索引等)來加以解決;

3、如果是表或者索引的不良設計導致的目標SQL的效能問題,我們可以通過重新設計表/索引,重新組織表裡的資料來加以解決;

4、如果上述調整措施都失效,我們可以考慮用並行來縮短目標SQL的執行時間;

5、如果上述調整措施、包括並行都失效,我們還可以在聯絡實際業務的基礎上更改目標SQL的執行邏輯,甚至不執行目標SQL,這是最徹底的優化。

Oracle資料庫優化的方法

1、減少訪問資料庫的次數。

2、不要讓資料庫做得太多。

(1)SELECT子句中避免使用' * ':ORACLE在解析的過程中,會將' * '依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的,這意味著將耗費更多的時間。

(2)sql語句用大寫的:因為oracle總是先解析sql語句,把小寫的字母轉換成大寫的再執行。另外,在java程式碼中儘量少用連線符“+”連線字串!

(3)使用表的別名(Alias):當在SQL語句中連線多個表時, 請使用表的別名並把別名字首於每個Column上。這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤。

(4) 用>=替代>:

高效: SELECT * FROM EMP WHERE DEPTNO >=4 

低效: SELECT * FROM EMP WHERE DEPTNO >3 

兩者的區別在於, 前者DBMS將直接跳到第一個DEPT等於4的記錄而後者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄。

(5) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率。 在子查詢中,NOT IN子句將執行一個內部的排序和合並。無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷)。 為了避免使用NOT IN ,我們可以把它改寫成外連線(Outer Joins)或NOT EXISTS。

例子:

(高效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')

(低效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')

(6)用EXISTS替換DISTINCT:例如:

低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO

高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

(7)儘量用UNION-ALL 替換UNION ( if possible)

當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合併, 然後在輸出最終結果前進行排序。

低效:SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’

UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’

高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’

UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’

(7) 避免在索引列上使用NOT:通常,避免在索引列上使用NOT, NOT會產生在和在索引列上使用函式相同的影響。 當Oracle”遇到”NOT,就會停止使用索引轉而執行全表掃描。

(8)用索引提高效率:索引是表的一個概念部分,用來提高檢索資料的效率,ORACLE使用了一個複雜的自平衡B-tree結構。 通常,通過索引查詢資料比全表掃描要快。當Oracle找出執行查詢和Update語句的最佳路徑時,Oracle優化器將使用索引。同樣在聯結多個表時使用索引也可以提高效率. 另一個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證。通常, 在大型表中使用索引特別有效。 雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價。 索引需要空間來儲存,也需要定期維護, 每當有記錄在表中增減或索引列被修改時,索引本身也會被修改。這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出4 , 5 次的磁碟I/O 。因為索引需要額外的儲存空間和處理,那些不必要的索引反而會使查詢反應時間變慢。定期的重構索引是有必要的。

Oracle建立索引的建議

1、表的主鍵、外來鍵必須有索引;Oracle中外來鍵不新增索引會引起死鎖。當刪除父表指定記錄時,子表會新增表級鎖,另一個程序刪除父表記錄(即使是不同記錄)時,會造成子表死鎖。當對子表的外來鍵列新增索引後,死鎖被消除,因為這時刪除父表記錄不需要對子表加表級鎖。

2、經常與其他表進行連線的表,在連線欄位上應該建立索引;

3、索引應該建在選擇性高的欄位上。例如:表示性別的資料列,由於只有男女兩種值,就屬於選擇性低;

4、索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;

5、複合索引的建立需要進行仔細分析,儘量考慮用單欄位索引代替:

A、正確選擇複合索引中的主列欄位(第一個欄位),一般是選擇性較好的欄位;

B、複合索引的幾個欄位是否經常同時以AND方式出現在WHERE子句中?單欄位查詢是否極少甚至沒有?如果是,則可以建立複合索引;否則考慮單欄位索引;

C、如果既有單欄位索引,又有這幾個欄位上的複合索引,一般可以刪除複合索引;

6、頻繁進行資料操作的表,不要建立太多的索引;

7、刪除無用的索引,避免對執行計劃造成負面影響;

總之,索引的建立必須慎重,對每個索引的必要性都應該經過仔細分析,要有建立的依據。因為太多的索引與不充分、不正確的索引對效能都毫無益處:在表上建立的每個索引都會增加儲存開銷,索引對於插入、刪除、更新操作也會增加處理上的開銷。另外,過多的複合索引,在有單欄位索引的情況下,一般都是沒有存在價值的;相反,還會降低資料增加刪除時的效能,特別是對頻繁更新的表來說,負面影響更大。

在大多數情況下,複合索引比單欄位索引好.複合索引比單欄位索引的效率高,但是,複合索引比單欄位索引的內容原理複雜,複合索引有兩個重要原則需要把握:字首性和可選性.如果糊里糊塗的濫用複合索引,效果適得其反。

以例子來說明,例子如下:

假設在員工表(EMP)的(ENAME,JOB,MGR)3個欄位上建了一個索引,例如索引名叫IDX_1.3個欄位分別為員工姓名,工作和所屬經理號。然後,寫如下一個查詢語句,並不斷進行查詢條件和次序的排列組合,例如:

<span style="font-family:Microsoft YaHei;">SELECT * FROM EMP WHERE ENAME = 'A' AND JOB = 'B' AND MGR = 3 ;  

SELECT * FROM EMP WHERE JOB = 'B' AND ENAME = 'A' AND MGR = 3 ;  

SELECT * FROM EMP WHERE MGR = 3 AND ENAME = 'A' AND JOB = 'B' ;  

SELECT * FROM EMP WHERE MGR = 3 AND JOB = 'B' AND ENAME = 'A' ;  

SELECT * FROM EMP WHERE JOB = 'B' AND MGR = 3 AND ENAME = 'A' ; </span>

回答問題:在各種條件組合情況下,剛才建的索引(IDX_1) 是用還是不用?也就是說對EMP表的訪問是全表掃描還是按索引(IDX_1)訪問?

答案是 :  上述語句中只要有ENAME='A'條件,就能用上索引(IND_1),而不是全表掃描(這就是複合索引的字首性).

相關推薦

MySQL/Oracle資料庫優化總結(非常全面)

MySQL資料庫優化的八種方式(經典必看) 引言: 關於資料庫優化,網上有不少資料和方法,但是不少質量參差不齊,有些總結的不夠到位,內容冗雜 偶爾發現了這篇文章,總結得很經典,文章流量也很大,所以拿到自己的總結文集中,積累優質文章,提升個人

oracle資料庫優化總結

1.      資料庫優化基本知識I/O 資料庫的基本作用就是實現對資料的管理與查詢。隨之而來的就是大量的IO操作, 在海量資料的情況下,資料庫的效能問題有80%以上和IO有關。優化ORACLE資料庫的I/O效能一般有兩個方面,一是減少處理時間,二是減少等待事件。資料塊ora

Oracle資料庫優化總結

分析和優化的基本步驟如下: 1、如果是SQL語句的寫法問題,我們可以通過在不更改業務邏輯的情況下改寫SQL來加以解決; 2、如果是不必要的全表掃描/排序而導致了目標SQL的效能問題,我們可以通過建立合適的索引(包括函式索引、點陣圖索引等)來加以解決; 3、如果是表或

Oracle資料庫優化的經驗總結

個人理解,資料庫效能最關鍵的因素在於IO,因為操作記憶體是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的IO,就個 人理解應該分為物理的和邏輯的優化, 物理的是指oracle產品本身的一些優化,邏輯優化是指應用程式級別的優化物理優化的一些原則:  1)Oracle的執行環境(網路,硬體

Oracle資料庫基礎總結

1.建表 CREATE TABLE orderdetail (   id number(11) NOT NULL  PRIMARY KEY,   orders_id number(11) NOT NULL,   items_id number(11)

Oracle 資料庫入門總結(一)

1,虛擬機器的安裝 參考文章:最新超詳細VMware虛擬機器下載與安裝  https://blog.csdn.net/qq_40950957/article/details/80467513   2,oracle10g資料庫的安裝 可以參考我換在的這篇文章

Oracle資料庫常用總結(持續更新)

Oracle是甲骨文(Oracle)公司的一款關係型資料庫管理系統(Relational Database Management System:RDBMS),在關係型資料庫領域,是最常用的資料庫之一,其他常用關係型資料庫還有:開源的MySQL,IBM的DB2

Oracle學習總結(2)——Oracle資料庫設計總結(三大正規化)

一、實體與表對應關係 表<=>實體,欄位<=>屬性。 二、表與表的關係(實體間的關係):一對一、一對多、多對多 一對一:一條記錄只對應其他表中的一條記錄有關係 學生基本資訊表t_student,成績表t_studentScore含有一個外來

mysql資料庫優化總結(心得)

1. 優化你的MySQL查詢快取在MySQL伺服器上進行查詢,可以啟用高速查詢快取。讓資料庫引擎在後臺悄悄的處理是提高效能的最有效方法之一。當同一個查詢被執行多次時,如果結果是從快取中提取,那是相當快的。但主要的問題是,它是那麼容易被隱藏起來以至於我們大多數程式設計師會忽略

Oracle資料庫優化的方法

1、減少訪問資料庫的次數。2、不要讓資料庫做得太多。(1)SELECT子句中避免使用' * ':ORACLE在解析的過程中,會將' * '依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的,這意味著將耗費更多的時間。(2)sql語句用大寫的:因為oracle總是先解析sql語句,把小寫的字母轉換成大寫的

mysql資料庫優化總結

一、MySQL的主要適用場景 1、Web網站系統 2、日誌記錄系統 3、資料倉庫系統 4、嵌入式系統 二、MySQL架構圖: 三、MySQL儲存引擎概述 1)MyISAM儲存引擎 MyISAM儲存引擎的表在資料庫中,每一個表都被存放為三個以表名命名的

資料庫優化總結(比較全面)

1.對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num i

針對QTP連線oracle資料庫問題總結

           首先,因為群裡很多朋友說QTP連線oracle有點麻煩,我針對於連線oracle做一個完整的教程,希望需要學習的朋友都可以來看一下;具體方法如下:  1、無論是什麼語言,連線oracle客戶端是不可少的,這個是沒辦法省的;我用的是10g_win32_c

資料庫優化總結

資料庫優化1、設計優化資料庫中,資料越小越好、null儘可能少、主鍵儘可能短儘量避免使用可變長度列(如:varchar、text、blob)2、許可權在查詢執行之前通過許可權系統檢查該查詢的過程,該過程越簡單,查詢速度越快3、表的優化如果一個表已經用了一段時間,則需要修復O

oracle 資料庫優化-鬆森科技

第一步 檢查用於造絲編網的器官。蜘蛛的腹部是一個用蛋白質來製造液體絲綢的器官。每個蜘蛛有1到4對穿孔管腺體,這被稱為吐絲器。蜘蛛將液體絲綢 第二步  觀察蜘蛛是如何開始織網。它發出一縷粘絲並期望隨風而動。當它掠過一些物理或棍子時,蜘蛛開始沿著之前的絲往返編織,直到絲足

oracle資料庫學習總結

基本知識: DBMS資料庫管理系統 DB資料庫(檔案) RDBMS關係型資料庫管理系統 RDB關係型資料庫 甲骨文   oracle9i oracle10g          oracle11g           IBM      DB2 微軟     sqlserve

MySQL資料庫優化總結 <轉>

       選擇適當的欄位型別,特別是主鍵   選擇欄位的一般原則是保小不保大,能用佔用位元組小的欄位就不用大欄位。比如主鍵, 我們強烈建議用自增型別,不用guid,為什麼?省空間啊?空間是什麼?空間就是效率!按4個位元組和按32個位元組定位一條記錄,誰快誰慢太明顯了。涉及到 幾個表做join時

sql優化oracle)- 第三部分  sql優化總結

mit 設計 tinc 重復 tin spa 替代 嵌套 多個 第三部分 sql優化總結 1. 優化一般原則 2. 具體註意事項 1. SQL優化一般性原則  1)目標:減少服務器資源消耗(主要是磁盤IO)  2)設計:    1. 盡量依

資料庫優化查詢方法總結

處理百萬級以上的資料提高查詢速度的方法: 1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order_by 涉及的列上建立索引。 3.應儘量避免在 wh

Mysql資料庫切換成Oracle資料庫,使用Mybatis+Oracle整合專案,Mysql與Oracle差別總結

最近公司給我一個任務,把現有專案由Mysql切換成Oracle,而且還要求相容Mysql和Oracle資料庫。網上有很多類似的資源,說了這兩個資料庫的差別,但是沒有進行完整的總結。在這個任務完成後,我在這裡總結一下。 1.原有的mysql的insert語句,沒有做空判斷,也沒有指定jdbc型別,