oracle數據庫優化
2024-08-29 13:29:12
供稿:網友
 
中國最大的web開發資源網站及技術社區,
優化就是選擇最有效的方法來執行sql語句。oracle優化器選擇它認為最有效的
方法來執行sql語句。
 
1).      is null和is not null
如果某列存在null值,即使對該列建立索引也不會提高性能。
2).      為不同的工作編寫不同的sql語句塊
為完成不同的工作編寫一大塊sql程序不是好方法。它往往導致每個任務的結果不優
化。若要sql完成不同的工作,一般應編寫不同的語句塊比編寫一個要好。
3).      in 和exists
select name from employee where name not in (select name from student);
select name from employee where not exists (select name from student);
第一句sql語句的執行效率不如第二句。
通過使用exists,oracle會首先檢查主查詢,然后運行子查詢直到它找到第一個匹配
項,這就節省了時間。oracle在執行in子查詢時,首先執行子查詢,并將獲得的結果
列表存放在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待
子查詢執行完畢,存放在臨時表中以后再執行主查詢。這也就是使用exists比使用in
通常查詢速度快的原因。
4).      not 運算符
select * from employee where salary<>1000;
select * from employee where salary<1000 or salary>1000;
第一句sql語句的執行效率不如第二句,因為第二句sql語句可以使用索引。
5).      order by 語句
order by 語句的執行效率很低,因為它要排序。應避免在order by 字句中使用表達式。
6).      列的連接
select * from employee where name||department=’zyzbioinfo’;
select * from employee where name=’zyz’ and department=’bioinfo’;
這兩個查詢,第二句比第一句會快,因為對于有連接運算符’||’的查詢,oracle優化器是不
會使用索引的。
7).      通配符‘%’當通配符出現在搜索詞首時,oracle優化器不使用索引
select * from employee where name like ‘%z%’;
select * from employee where name like ‘z%’;
第二句的執行效率會比第一句快,但查詢結果集可能會不同。
8).      應盡量避免混合類型的表達式
假設字段studentno為varchar2類型
有語句select * from student where studentno>123;
則oracle會有一個隱含的類型轉換。隱含的類型轉換可能會使oracle優化器忽略索引。
這時應使用顯式的類型轉換select * from student where studentno=to_char(123)。
9).distinct
   distinct總是建立一個排序,所以查詢速度也慢。