Oracle多表查詢的優化

2021-09-01 08:42:56 字數 2640 閱讀 8843

1,重複性查詢:

當你向oracle提供乙個sql的時候,oracle會首先在相應的記憶體中查詢這條語句,如果匹配到,就能直接返回結果,這樣就能節省記憶體和提高資料訪問效率。但是匹配sql語句需要注意以下幾點:

(1)字元級的比較:sql語句和共享池中的語句必須完全相同才能匹配完整,尤其注意大小寫和空格

(2)兩個語句所指的物件必須完全相同,就是說sql語句共享是區分使用者的,兩個使用者的公共物件才能共享sql

(3)sql語句中必須使用相同的名字的繫結變數

2,表名順序對效率的影響:oracle是從右到左的順序解析from字句中的表名

例如表a中有 1500條資料,b中有1條資料

低效率:select count(*) from b,a

高效率:select count(*) from a,b

3,三個以上的表連線查詢,就需要選擇交叉表作為基礎表

低效率:select * from e,a,b

where e.x = ***

and e.y = a.y

and e.z = b.z

高效率:select * from a,b,e

where e.x = ***

and e.y = a.y

and e.z = b.z

4,where子句中的連線順序:oracle採用自上而下的順序解析where子句,所以表之間的連線一定寫在其他的條件之前,

那些可以過濾掉最帶資料量的條件要放在末尾

低效率:select ***

from emp e

where sal > 5000

and job = 'manager'

and 管理人數》20

高效率:select ***

from emp e

where 管理人數》20

and al > 5000

and job = 'manager'

5,select子句中避免使用*:實際上,oracle在解析的過程中,會將「*」依次轉換成所有的列名

6,儘量減少訪問資料庫的次數

例:select type ,decode(blood_test_flag,'y','yes','n','no',null,'none','invalid') from a;

使用例項:

低效率:             

select count(*) ,sum(sal) from emp

where dept_no = 1

and ename like 'zj';

select count(*) ,sum(sal) from emp

where dept_no = 2

and ename like 'zj';

高效率:             

select count(decode(dept_no,1,'x',null)) count_1,

count(decode(dept_no,2,'x',null)) count_2,

sum(decode(dept_no,1,sal,null)) sal_1,

sum(decode(dept_no,2,sal,null)) sal_2

from emp

where ename like 'zj';

8,刪除重覆記錄

最高效刪除重覆記錄的方法(使用rowid)

delete from emp e

where e.rowid > (

select min(x.rowid)

from emp x

where x.emp_no = e.emp_no

9,update語句

低效率:update a set a = 1,b=2 where id = 01;

高效率:update a set (a ,b)=(1,2) where id = 01;

10,用exist代替in

低效率:select * from emp

where  empno > 0

and  empno in (

select deptno

from dept

where loc = 'melg'

高效率:select * from emp

where empno > 0

and exists (

select  'x' from dept

where dept.deptno = emp.deptno

and loc = 'melg'

11,識別』低效率執行『的sql語句

可以使用下面的sql語句查詢出低效sql:

select executions ,disk_reads,buffer_gets,

round((buffer_gets-disk_reads)/buffer_gets,2) hit_radio.

round(disk_reads/executions,2)reads_per_run,

sql_text

from v$sqlarea

where executions>0

and buffer_gets>0

and (buffer_gets-disk_reads)/buffer_gets<0.8

group by 4 desc;

ORACLE多表查詢優化

oracle有個高速緩衝的概念,這個高速緩衝就是存放執行過的sql語句,那oracle在執行sql語句的時候要做很多任務作,例如解析sql語句,估算索引利用率,繫結變數,讀取資料塊等等這些操作。假設高速緩衝裡已經儲存了執行過的sql語句,那就直接匹配執行了,少了步驟,自然就快了,但是經過測試會發現高...

oracle多表查詢優化

用select 時,少用 多用字段 select name,code from table,select from table select count from table1 tabale2 table2的記錄數比table1的記錄少,查詢速度快 如果要是三張表,其中乙個是中間表的話,中間表放在最...

Oracle 多表查詢

sql 外連線 sql 按部門統計員工人數 部門號 部門名稱 人數 sql select d.deptno,d.dname,count e.empno 2 from dept d,emp e 3 where d.deptno e.deptno 4 group by d.deptno,d.dname ...