這篇文章是在一本書上看到的,並加上自己的理解,和大家一起分享。。。
Oracle採用兩種方式掃描表:
a,全表掃描。這種方式下,oracle會從表的第一個記錄按順序掃描尋找資料。
b,採用rowid。這種方式下,oracle採用索引的方式,實現rowid和資料的物理位置之間的聯絡。通常採用索引可以提高查詢速度,但是索引會降低資料的插入和刪除速度。因為每次修改資料時,oracle都會重新編排索引。
選擇最有效表名順序。oracle在處理from字句時,會按照從右至左的順序處理表,因此最後一個表將被先處理。因此在from字句中有多個表時,需要注意表的順序。
oracle採用自下向上的順序處理where子句。因此需要將表串連條件寫在其他條件前面,這樣可以過濾掉大部分資料。
例如:效率低下的語句
select * from emp e where sal>5000 and job="manager" and 25 <(select count(*) from emp where e.empNo=mgr)
效率高的語句:
select * from emp e where 25<(select count(*) from emp where e.empNo=mgr) and sal>5000 and job="manager"
在select子句中避免使用“*”。oracle在處理“*”時,首先會查詢資料字典將“*”轉換成對應的列名,這是效率很低下的。
減少訪問資料庫的次數。當執行每天sql語句時,oracle需要做很多的事情:解析sql語句,估計索引利用率,綁定變數等。因此減少訪問資料次數,可以提供效率。
例如:
效率低下的語句:
select * from emp where id=1;select * from emp where id=2;
效率高的語句:
select * from emp where id=1 and id=2
重複資料刪除記錄最高效的方法(因為使用了rowId):
delete from emp e where e.rowId=(select min(x.rowId) from emp x where x.id=e.id)
刪除表時使用truncate代替delete。但是使用delete刪除時,若事物沒有被提交,可以恢複刪除的資料。但是使用truncate則不可以。因為truncate是ddl語句,而delete是dml語句。ddl語句會自動認可事務。
在程式中盡量多commit,這樣可以釋放一些資源。