Oracle SQL語句具有共享特性,爲了避免讓ORACLE數據庫重複解析相同的簡單單表SQL語句,ORACLE在SGA系統共享區域內SBP共享池內存放的SQL語句將被全部用戶共享。(注:只適合單表查詢,多表鏈接查詢無效!)
ORACLE SQL語句共享,表如今三個方面
1.字符級共享
可簡單理解爲 SQL語句大小寫區分
如:
select * from employee;
與
select * From employee;
Select * from Employee;
以上三條語句ORACEL解析器會認爲是三條不一樣的SQL語句,即不能共享
2.綁定變量必須相同
如:
A
1.select username,password from user where id=:uid
2.select username,password from user where id=:uid
B
1.select username,password from user where id=:uid
2.select username,password from user where id=:Kid
A兩條語句可共享,B兩條語句綁定不一樣,不可共享
3.語句所指對象必徹底相同
如
用戶 對象 訪問權限
ROOT TAB1 private
TAB2 public
###############################
AVEN TAB1 private
TAB2 public
SQL語句
Q1. SELECT COUNT(*) FROM TAB1 ,不可共享,每個用戶有本身私有的表TAB1
Q2. SELECT COUNT(*) FROM TAB2 ,可共享html
SQL語句中,where子句後面的所帶的條件的順序帶來的優化!
ORACLE解析器採用自下而上的方式解析WHERE子句。
根據這一原理,咱們應將可以一下過濾掉最大數量的條件應儘量地放在WHERE子句的最後面,而對於關聯表的鏈接查詢,像這樣的條件,剛儘量地放在WHERE子句前面。
舉例說明,EMP員工表,MGR主管表,EMP的mrg_id爲MGR表主鍵
查詢年紀大於50歲而且主管是‘XXX’的記錄時。
低效狀況:
select name,age from emp where age>50 and mrg_id in select(select id from mrg where name='xxx') ;
高效狀況:
select name,age from emp where mrg_id in select(select id from mrg where name='xxx') and age>50;mysql
在使用select語句時,避免使用動態sql語句列引用符「*」,當使用這個「*」,是一種至關低效的方法,oracle會先對對應的表全部列名解析一遍,那樣子會至關的慢慢,最高效的方法是,在用到哪些列名時,直接寫列名查詢。最後還有一個注意點,在使用count內部函數時,也不用輕易使用「*」,改成select(pk) from tab_name去查詢。sql
建議在ORACEL多表鏈接查詢時,所要查詢出來字段前使用別名alias,使用別名的好處有兩個
第一,避免多表間存在同名列,而報錯。舉例,A表有字段c_column,B表也有字段c_column,SQL語句(select c_column from A,B WHERE XXXX)時,會報錯,沒法知道c_column歸屬哪張表
第二,減小數據庫解析時間,指定了別名,數據庫解析器直接去查別名所在名的字段,加快查詢速度。數據庫
還有不少有關 oracle sql優化的規則請參考:oracle
http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html函數