ORACLE SQL性能優化彙總

ORACLE SQL語句共享

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

 

ORACLE SQL 多表聯合查詢

ORACLE在多表查詢時,選擇合適的基礎表進行查詢,SQL效率會比較高!
所謂基礎表,是指在排在from後面的表列當中,最後一個位置的表稱爲基礎表。
ORACLE解析器在處理FROM子句時,會從FROM後面的最後一個表開始向前依次鏈接查詢
如selec t a.name ,b.code,c.content from A a,B b,C c where 。。。時,會先查詢C表,再與B錶鏈接,最後與A錶鏈接查詢。
因此要選擇適當的表做爲基礎表,放到from最後一個位置。
在此處咱們假設各表的記錄數大小順序爲A<B<C表
則優化語句不該該像以上SQL那樣子寫
最優寫法:selec t a.name ,b.code,c.content from  C c,B b,A a where 。。。
最後要說明一點:對於交叉表查詢,所謂交叉關聯表做爲基礎表進行查詢最優。所謂交叉表,舉學生選課爲例來講,學生表,課程表,選課狀況表,這三張表當中,選課狀況表爲交叉表,應做爲基礎表進行查詢。

where語句條件順序

 

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 列引用符「*」

在使用select語句時,避免使用動態sql語句列引用符「*」,當使用這個「*」,是一種至關低效的方法,oracle會先對對應的表全部列名解析一遍,那樣子會至關的慢慢,最高效的方法是,在用到哪些列名時,直接寫列名查詢。最後還有一個注意點,在使用count內部函數時,也不用輕易使用「*」,改成select(pk) from tab_name去查詢。sql

ORACEL多表鏈接查詢指定表別名alias

建議在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函數

相關文章
相關標籤/搜索