select語句優(yōu)化
select查詢的生命周期
- 在共享池中搜索sql語句是否存在 -- 緩存
- 驗(yàn)證sql語句是否正確
- 執(zhí)行數(shù)據(jù)字典來驗(yàn)證表和列的定義
- 獲取對象的分析鎖姜骡,以便在語句的分析過程中對象的定義不會(huì)改變
- 檢查用戶是否具有相同的操作權(quán)限
- 確定sql語句的最佳執(zhí)行計(jì)劃
- 將語句和執(zhí)行方案保存到共享的sql區(qū)中
- select語句中盡量避免使用 * 這樣影響了sql語句的執(zhí)行效率拳亿。
原因: 這里是因?yàn)閟ql在執(zhí)行的周期中要把 * 根據(jù)數(shù)據(jù)字典轉(zhuǎn)化成相應(yīng)的列信息椒惨。但是也僅限于第一次,因?yàn)橛衧ql共享池闪檬。
- 使用where字句代替having字句
-- 使用having
select deptno , avg(sal) , from scott.emp
group by deptno having deptno > 10 ;
-- 使用where
select deptno , avg(sal) , from scott.emp
where deptno > 10 group by deptno ;
-- 原因:先使用了where后減少了分組的行數(shù),就是提前減少了數(shù)據(jù)量橱脸。
使用trunacte 代替delete(全表刪除的時(shí)候)
在確保完整性的情況下多用commit語句(就是提前釋放一些維護(hù)事務(wù)的資源)
使用表連接而不是多個(gè)查詢
-- 子查詢方式
select empno , ename , deptno from emp
where deptno = (select deptno from emp where dname='誰誰')
-- 表連接的方式
select e.empno , e.ename , d.deptno
from emp e inner join emo d on e.deptno = d.deptno
where d.dname = '誰誰' ;
-- 原因 抒和; 這樣的優(yōu)化是減少查詢的次數(shù)膳沽。
-- 連接查詢的局部優(yōu)化將最多的記錄放到前面連接少的數(shù)據(jù)汗菜。
- 使用exists代替in
-- 關(guān)鍵字的不同點(diǎn) exists只檢查行存在性 , in檢查實(shí)際的值
-- not exists 代替 not in
-- in demo
select * from emp
where deptno in(select deptno from dept where loc = 'xxxx');
-- exists demo
select * from emp
where exists(select 1 from dept where dept.deptno = emp.deptno and loc='xxxx');
-- 注意這樣就成了檢查列是否存在了挑社。
- 使用exists代替distinct(去重的那個(gè))
-- distinct
select distinct e.deptno , d.dname
from emp e , dept d
where e.deptno = d.deptno ;
-- exists
select e.deptno , d.dname from deot d
where exists(select 1 from emp e where e.deptno=deptno);
- 使用 <= 代替 <
思路:就是 sql語句的值的定位的問題陨界,
<= x 會(huì)直接定位到 x
< x 會(huì)直接定位到 x , 在查詢比他小的數(shù)
-- 數(shù)據(jù)量大的時(shí)候使用 = 就是查了一條
- 起別名后痛阻,列要完全限定菌瘪,減少數(shù)據(jù)字典搜索的次數(shù)。
表連接的優(yōu)化
oracle是用最后的一張表作為驅(qū)動(dòng)表阱当,所以把數(shù)據(jù)量小的放到后面比較合適俏扩。
where字句的連接順序
-- 慢
select * from emp e
where sal > 1000
and job = 'xxxx'
and 10 < (select count(*) from emp where mgr = empno);
-- 快
select * from emp e
where 10 < (select count(*) from emp where mgr = empno)
and sal > 1000 and job = 'xxxx' ;
思想: 優(yōu)先的條件過濾掉多個(gè)行,最大可能性的減少表的范圍弊添。