1 選用適合的ORACLE優化器

2021-04-01 19:06:15 字數 3649 閱讀 4450

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之前,...