共享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...