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