Oracle sql 效能優化調整(3)

2021-08-21 11:47:00 字數 1912 閱讀 4871

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 SQL語句效能調整原則

一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優 劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面 就是sql語句的優...

ORACLE SQL效能優化(二)

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

ORACLE SQL效能優化(三)

8.使用decode函式來減少處理時間 使用decode函式可以避免重複掃瞄相同記錄或重複連線相同的表.例如 select count sum sal from emp where dept no 0020 and ename like smith select count sum sal from...