ORACLE SQL效能優化系列 一

2021-04-01 05:06:52 字數 3933 閱讀 9108

1. 選用適合的

oracle優化器

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)

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;

(待續)

**black_snail的專欄

ORACLE SQL效能優化系列

1.選用適合的 oracle 優化器 oracle 的優化器共有3種 a.rule 基於規則 b.cost 基於成本 c.choose 選擇性 設定預設的優化器 可以通過對 init.ora 檔案中optimizer mode 引數的各種宣告,如 rule,cost,choose,all rows,...

ORACLE SQL效能優化系列

1.選用適合的oracle優化器 oracle的優化器共有3種 a.rule 基於規則 b.cost 基於成本 c.choose 選擇性 設定預設的優化器,可以通過對init.ora檔案中optimizer mode引數的各種宣告,如rule,cost,choose,all rows,first r...

Oracle SQL效能優化系列

1.選用適合的oracle優化器 oracle的優化器共有3種 a.rule 基於規則 b.cost 基於成本 c.choose 選擇性 設定預設的優化器,可以通過對init.ora檔案中optimizer mode引數的各種宣告,如rule,cost,choose,all rows,first r...