oracle
的優化器共有3種
:a. rule (
基於規則
)b. cost (
基於成本
)c. choose (
選擇性)
設定預設的優化器
,可以通過對
init.ora
檔案中optimizer_mode
引數的各種宣告,如
rule,cost,choose,all_rows,first_rows .
你當然也在
sql句級或是會話
(session)
級對其進行覆蓋
.為了使用基於成本的優化器
(cbo, cost-based optimizer) ,
你必須經常執行
analyze 命令,
以增加資料庫中的物件統計資訊
(object statistics)
的準確性
.如果資料庫的優化器模式設定為選擇性
(choose),
那麼實際的優化器模式將和是否執行過
analyze
命令有關
. 如果
table
已經被analyze過,
優化器模式將自動成為
cbo , 反之,
資料庫將採用
rule
形式的優化器
.在預設情況下
,oracle
採用choose
優化器,
為了避免那些不必要的全表掃瞄
(full table scan) ,
你必須盡量避免使用
choose
優化器,
而直接採用基於規則或者基於成本的優化器
.2.
訪問
table的方式
oracle
採用兩種訪問表中記錄的方式:a.
全表掃瞄
全表掃瞄就是順序地訪問表中每條記錄
. oracle
採用一次讀入多個資料塊
(database block)
的方式優化全表掃瞄.b.
通過rowid
訪問表你可以採用基於
rowid
的訪問方式情況
,提高訪問表的效率
, , rowid
包含了表中記錄的物理位置資訊
..oracle
採用索引
(index)
實現了資料和存放資料的物理位置
(rowid)
之間的聯絡
. 通常索引提供了快速訪問
rowid
的方法,
因此那些基於索引列的查詢就可以得到效能上的提高
.3.
共享
sql語句
為了不重複解析相同的
sql語句
,在第一次解析之後
, oracle
將sql
語句存放在記憶體中
.這塊位於系統全域性區域
sga(system global area)
的共享池
(shared buffer pool)
中的記憶體可以被所有的資料庫使用者共享
. 因此
,當你執行乙個
sql語句
(有時被稱為乙個游標)時
,如果它
和之前的執行過的語句完全相同
, oracle
就能很快獲得已經被解析的語句以及最好的
執行路徑
. oracle
的這個功能大大地提高了
sql的執行效能並節省了記憶體的使用
.可惜的是
oracle
只對簡單的表提供高速緩衝
(cache buffering) ,
這個功能並不適用於多表連線查詢
.資料庫管理員必須在
init.ora
中為這個區域設定合適的引數
,當這個記憶體區域越大
,就可以保留更多的語句
,當然被共享的可能性也就越大了
.當你向
oracle
提交乙個
sql語句
,oracle
會首先在這塊記憶體中查詢相同的語句
.這裡需要註明的是
,oracle
對兩者採取的是一種嚴格匹配
,要達成共享
,sql
語句必須
完全相同
(包括空格
,換行等
).共享的語句必須滿足三個條件:a.
字元級的比較
:當前被執行的語句和共享池中的語句必須完全相同.例如
:select * from emp;
和下列每乙個都不同
select * from emp;
select * from emp;
select*from emp;
b.兩個語句所指的物件必須完全相同:例如
:使用者
物件名如何訪問
jacksal_limitprivate synonym
work_citypublic synonym
plant_detailpublic synonym
jillsal_limitprivate synonym
work_citypublic synonym
plant_detailtable owner
考慮一下下列
sql語句能否在這兩個使用者之間共享
.sql
能否共享
原因
select max(sal_cap) from sal_limit;
不能每個使用者都有乙個private synonym - sal_limit , 它們是不同的物件
select count(*0 from work_city where sdesc like 'new%';
能兩個使用者訪問相同的物件public synonym - work_city
select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id
不能使用者jack 通過private synonym訪問plant_detail 而jill 是表的所有者,物件不同.
c.兩個
sql語句中必須使用相同的名字的繫結變數
(bind variables)
例如:第一組的兩個
sql語句是相同的
(可以共享
),而第二組中的兩個語句是不同的
(即使在執行時
,賦於不同的繫結變數相同的值)a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;
b.select pin , name from people where pin =:blk1.ot_ind;
select pin , name from people where pin =:blk1.ov_ind;
oracle優化2(選用適合的ORACLE優化器)
優化器 rbo cbo oracle 的優化器有兩種優化方式 即基於規則的優化方式 rule based optimization 簡稱為 rbo 和基於代價的優化方式 cost based optimization 簡稱為 cbo 在oracle8 及以後的版本 oracle 強列推薦用 cbo的...
Oracle認證 Oracle優化器的優化方式
oracle是世界領先的資訊管理軟體開發商,因其複雜的關聯式資料庫產品而聞名。本文介紹oracle優化器,它是乙個非常好用的工具。oracle在執行乙個sql之前,首先要分析一下語句的執行計畫,然後再按執行計畫去執行。分析語句的執行計畫的工作是由優化器 optimizer 來完成的。不同的情況,一條...
Oracle的優化器
一 目的 1 說一說oracle的optimizer及其相關的一些知識。2 回答一下為什麼有時乙個表的某個字段明明有索引,當觀察一些sql的執行計畫時,發現確不走索引的問題。3 如果你對 first rows all rows這兩種模式有疑惑時也可以看一下這篇文章。oracle在執行乙個sql之前,...