天天看點

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

2.select  username,password from user where id=:Kid

A兩條語句可共享,B兩條語句綁定不同,不可共享

3.語句所指對象必完全相同

使用者            對象                        通路權限

ROOT             TAB1                      private

                 TAB2                      public

###############################

AVEN             TAB1                      private

 SQL語句

Q1. SELECT COUNT(*) FROM TAB1 ,不可共享,每一個使用者有自己私有的表TAB1

Q2. SELECT COUNT(*) FROM TAB2 ,可共享

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;

select 列引用符“*”

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

ORACEL多表連接配接查詢指定表别名alias

建議在ORACEL多表連接配接查詢時,所要查詢出來字段前使用别名alias,使用别名的好處有兩個

第一,避免多表間存在同名列,而報錯。舉例,A表有字段c_column,B表也有字段c_column,SQL語句(select c_column from A,B WHERE XXXX)時,會報錯,無法知道c_column歸屬哪張表

第二,減少資料庫解析時間,指定了别名,資料庫解析器直接去查别名所在名的字段,加快查詢速度。

還有很多有關 oracle sql優化的規則請參考:

http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html

關注90後夢想大師,夢想從未止步.