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解析器...