ORACEL SQL 效能優化 一

2021-04-12 21:55:43 字數 2931 閱讀 4564

關鍵字 oracel sql performance tuning

出處 http://www.dbasupport.com

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;

效能優化一

4 硬體效能優化 硬體效能指由硬體或軟體引起的導致電池消耗的效能,具體包括螢幕 感測器 cpu wakelock jobscheduler等耗電效能。4.1電量資訊獲取 通過手機系統檔案。直接通過手機系統檔案 sys class power supply battery uevent 來獲取手機電量...

Drupal效能優化 蜜蜂培訓效能優化一

大家一直都說drupal的效能不怎麼樣,跑起來慢,即使不是在使用者量大的時候,最近公司的蜜蜂培訓產品在乙個客戶的使用過程中,由於使用者量及資料量的激增,就遇到了比較大的效能問題,這篇文章就記錄了整個優化過程,最終將效能調整到了正常水平。蜜蜂培訓系統由於是包含報名 簽到 投票 評估 考試等場景,而這些...

SQL效能優化(一)

1.選擇最有效率的表名順序 只在基於規則的優化器中有效 oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表 基礎表 driving table 將被最先處理.在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當oracle處理多個表...