Oracle語句優化規則彙總 2

2021-08-29 14:47:53 字數 3330 閱讀 4360

1. where子句中的連線順序。

oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。

例如:(低效,執行時間156.3秒)

select …

from emp e

where sal > 50000

and job = 『manager』

and 25 < (select count(*) from emp

where mgr=e.empno);

(高效,執行時間10.6秒)

select …

from emp e

where 25 < (select count(*) from emp

where mgr=e.empno)

and sal > 50000

and job = 『manager』;

2. select子句中避免使用『 * 』

當你想在select子句中列出所有的column時,使用動態sql列引用『*』 是乙個方便的方法。不幸的是,這是乙個非常低效的方法。實際上,oracle在解析的過程中,會將『*』 依次轉換成所有的列名,這個工作是通過查詢資料字典完成的,這意味著將耗費更多的時間。

3.減少訪問資料庫的次數

當執行每條sql語句時,oracle在內部執行了許多任務作:解析sql語句,估算索引的利用率,繫結變數,讀資料塊等等。由此可見,減少訪問資料庫的次數,就能實際上減少oracle的工作量。

例如,以下有三種方法可以檢索出雇員號等於0342或0291的職員。

方法1 (最低效)

select emp_name , salary , grade

from emp

where emp_no = 342;

select emp_name , salary , grade

from emp

where emp_no = 291;

方法2 (次低效)

declare

cursor c1 (e_no number) is

select emp_name,salary,grade

from emp

where emp_no = e_no;

begin

open c1(342);

fetch c1 into …,..,.. ;

open c1(291);

fetch c1 into …,..,.. ;

close c1;

end;

方法3 (高效)

以下是引用片段:

select a.emp_name , a.salary , a.grade,

b.emp_name , b.salary , b.grade

from emp a,emp b

where a.emp_no = 342

and b.emp_no = 291;

注意:在sql*plus ,sql*forms和pro*c中重新設定arraysize引數,可以增加每次資料庫訪問的檢索資料量,建議值為200.

4.使用decode函式來減少處理時間

使用decode函式可以避免重複掃瞄相同記錄或重複連線相同的表。

例如:select count(*),sum(sal)

from

emp

where dept_no = 0020

and ename like

『smith%』;

select count(*),sum(sal)

from

emp

where dept_no = 0030

and ename like

『smith%』;

你可以用decode函式高效地得到相同結果

select count(decode(dept_no,0020,』x』,null)) d0020_count,

count(decode(dept_no,0030,』x』,null)) d0030_count,

sum(decode(dept_no,0020,sal,null)) d0020_sal,

sum(decode(dept_no,0030,sal,null)) d0030_sal

from emp where ename like 『smith%』;

類似的,decode函式也可以運用於group by 和order by子句中。

5.整合簡單,無關聯的資料庫訪問

例如:select name

from emp

where emp_no = 1234;

select name

from dpt

where dpt_no = 10 ;

select name

from cat

where cat_type = 『rd』;

上面的3個查詢可以被合併成乙個:

select e.name , d.name , c.name

from cat c , dpt d , emp e,dual x

where nvl(『x』,x.dummy) = nvl(『x』,e.rowid(+))

and nvl(『x』,x.dummy) = nvl(『x』,d.rowid(+))

and nvl(『x』,x.dummy) = nvl(『x』,c.rowid(+))

and e.emp_no(+) = 1234

and d.dept_no(+) = 10

and c.cat_type(+) = 『rd』;

(雖然採取這種方法,效率得到提高,但是程式的可讀性大大降低,所以還是要權衡之間的利弊)

Oracle語句優化規則彙總 1

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

Oracle語句優化規則彙總 4

1.使用表的別名 alias 當在sql語句中連線多個表時,請使用表的別名並把別名字首於每個column上。這樣一來,就可以減少解析的時間並減少那些由column歧義引起的語法錯誤。column歧義指的是由於sql中不同的表具有相同的column名,當sql語句中出現這個column時,sql解析器...

Oracle語句優化規則彙總 4

1.使用表的別名 alias 當在sql語句中連線多個表時,請使用表的別名並把別名字首於每個column上。這樣一來,就可以減少解析的時間並減少那些由column歧義引起的語法錯誤。column歧義指的是由於sql中不同的表具有相同的column名,當sql語句中出現這個column時,sql解析器...