Oracle 优化相关
1、ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.
2、ORACLE采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。
3、SELECT子句中避免使用 ‘ * ‘(ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間)。
4、替換效率:in ?--》 exists --》表連接
? ???in的常量列表是優化的(例如:aab019 in (‘20’,’30’)),不用exists替換;in列表相當于or
5、用EXISTS替換DISTINCT
?當提交一個包含一對多表信息(比如個人基本信息表和個人參保信息表)的查詢時,避免在SELECT子句中使用DISTINCT.一般可以考慮用EXISTS替換?
?例如:?
低效:?
select distinct ac01.aac001
from ac02,ac01
where ac02.aac001 = ac01.aac001
and ac02.aae140='31'
and ac01.aab001='100100';?
高效:?
select ac01.aac001
from ac01
where exists(select 1 from ac02 where aac001 = ac01.aac001
and aae140='31')
and ac01.aab001='100100';
6、盡量用union all替換union
Union會去掉重復的記錄,會有排序的動作,會浪費時間。因此在沒有重復記錄的情況下或可以允許有重復記錄的話,要盡量采用union all來關聯。
7、使用DECODE函數來減少處理時間
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.?
例如:
(低效)
select count(1) from ac01 where aab001=’100001’and aac008=’1’;?
select count(1) from ac01 where aab001=’100001’and aac008=’2’;
(低效)
Select count(1),aac008
?From ac01
Where aab001=’100001’
??and aac008 in (’1’,’2’)
group by aac008;
(高效)
select count(decode(aac008,’1’,’1’,null)) zz,
count(decode(aac008,’2’,’1’,null))tx
from ac01
where aab001=’100001’;
特別說明:
group by和order by 都會影響性能,編程時盡量避免沒有必要的分組和排序,或者通過其他的有效的編程辦法去替換,比如上面的處理辦法。
8、在使用left?jion時,on和where條件的區別如下:
1、?on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left?join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
因此左表的條件要放在為where后。
?
轉載于:https://www.cnblogs.com/doudingbest/p/7008565.html
總結
以上是生活随笔為你收集整理的Oracle 优化相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux bridge 资料链接
- 下一篇: Linux 进程地址空间 进程内存布局