程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 概論Oracle數據庫優化器

概論Oracle數據庫優化器

編輯:Oracle數據庫基礎
在工作中也很喜歡總結關於Oracle數據庫優化器的經驗教訓,下面就這個問題來詳細說說吧。Oracle數據庫優化器共有3種:
a.  RULE (基於規則)  
b. COST (基於成本) 
c. CHOOSE (選擇性)

為了使用基於成本的優化器(CBO, Cost-Based Optimizer) , 你必須定期更新統計信息,以保證數據庫中的對象統計信息(object statistics)的准確性.

如果Oracle數據庫優化器模式設置為選擇性(CHOOSE),那麼實際的優化器模式將和是否運行過analyze命令有關. 如果table已經被analyze過, 優化器模式將自動成為CBO , 反之,數據庫將采用RULE形式的優化器。

訪問Table的方式

Oracle 采用兩種訪問表中記錄的方式:
a. 全表掃描:全表掃描就是順序地訪問表中每條記錄. Oracle采用一次讀入多個數      據塊(database block)的方式優化全表掃描。
b. 索引掃描:你可以采用基於ROWID的訪問方式情況,提高訪問表的效率, ROWID包含了表中記錄的物理位置信息.Oracle采用索引(INDEX)實現了數據和存放數據的物理位置(ROWID)之間的聯系. 通常索引提供了快速訪問ROWID的方法,因此那些基於索引列的查詢就可以得到性能上的提高.

其中Oracle對索引又有兩種訪問模式.

a)索引唯一掃描 ( INDEX UNIQUE SCAN)大多數情況下, 優化器通過WHERE子句訪問INDEX.

表LOADING有兩個索引 : 建立在LOADING列上的唯一性索引LOADING_PK和建立在MANAGER列上的非唯一性索引IDX_MANAGER.

  1. SELECT loading    
  2. FROM LOADING  
  3. WHERE LOADING = ‘ROSE HILL’; 

在內部 , 上述SQL將被分成兩步執行, 首先 , LOADING_PK 索引將通過索引唯一掃描的方式被訪問 , 獲得相對應的ROWID, 通過ROWID訪問表的方式執行下一步檢索.如果被檢索返回的列包括在INDEX列中,Oracle將不執行第二步的處理(通過ROWID訪問表). 因為檢索數據保存在索引中, 單單訪問索引就可以完全滿足查詢結果.下面SQL只需要INDEX UNIQUE SCAN 操作.

  1. SELECT LOADING  
  2. FROM  LOADING  
  3. WHERE LOADING = ‘ROSE HILL’; 

b)索引范圍查詢(INDEX RANGE SCAN)適用於兩種情況:
1. 基於一個范圍的檢索
2. 基於非唯一性索引的檢索

WHERE子句條件包括一系列值, Oracle將通過索引范圍查詢的方式查詢LODGING_PK . 由於索引范圍查詢將返回一組值, 它的效率就要比索引唯一掃描低一些. 這個SQL的執行分兩步, IDX_MANAGER的索引范圍查詢(得到所有符合條件記錄的ROWID) 和下一步同過ROWID訪問表得到LOADING列的值. 由於IDX_MANAGER是一個非唯一性的索引,數據庫不能對它執行索引唯一掃描.由於SQL返回LOADING列,而它並不存在於IDX_MANAGER索引中, 所以在索引范圍查詢後會執行一個通過ROWID訪問表的操作.WHERE子句中, 如果索引列所對應的值的第一個字符由通配符(WILDCARD)開始, 索引將不被采用.在這種情況下,Oracle將使用全表掃描.以上介紹Oracle數據庫優化器。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved