ORACLE SQL效能優化系列 一

2021-03-31 08:56:28 字數 2813 閱讀 4000

關鍵字 oracel sql performance tuning

出處 http://.dbasupport.***

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. 兩個語句所指的物件必須完全相同:

例如:

使用者 物件名 如何訪問

jack sal_limit private synonym

work_city public synonym

plant_detail public synonym

jill sal_limit private synonym

work_city public synonym

plant_detail table 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 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...