oracle資料庫最佳化
來源:互聯網
上載者:User
oracle|資料|資料庫|最佳化
最佳化就是選擇最有效方法來執行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總是建立一個排序,所以查詢速度也慢。