1. 程式人生 > >數據庫優化方案

數據庫優化方案

desc ons mce 個數 掃描 順序 過濾 ron 避免

1. 高效地進行SQL語句設計:

通常情況下,可以采用下面的方法優化SQL對數據操作的表現:
(1)減少對數據庫的查詢次數,即減少對系統資源的請求,使用快照和顯形圖等分布式數據庫對象可以減少對數據庫的查詢次數。
(2)盡量使用相同的或非常類似的SQL語句進行查詢,這樣不僅充分利用SQL共享池中的已經分析的語法樹,要查詢的數據在SGA中命中的可能性也會大大增加。
(3)避免不帶任何條件的SQL語句的執行。沒有任何條件的SQL語句在執行時,通常要進行FTS,數據庫先定位一個數據塊,然後按順序依次查找其它數據,對於大型表這將是一個漫長的過程。
(4)如果對有些表中的數據有約束,最好在建表的SQL語句用描述完整性來實現,而不是用SQL程序中實現。

2、操作符優化

(1)IN操作符:經常碰到使用in的語句,一定要用exists把它給換掉,因為Oracle在處理In時是按Or的方式做的,即使使用了索引也會很慢

(2)NOT IN操作符:不能應用表的索引。用NOT EXISTS或(外連接+判斷為空)方案代替

(3)IS NULL或IS NOT NULL操作:低效: (索引失效) SELECT …FROM DEPARTMENT WHERE DEPT_CODE ISNOTNULL;高效: (索引有效)SELECT …     FROM DEPARTMENT WHERE DEPT_CODE >=0

;

(4)>及 < 操作符(大於或小於操作符):用>=替代> 高效: SELECT …FROM DEPARTMENT WHERE DEPT_CODE >=0;低效:SELECT*FROM EMPWHERE DEPTNO >3 兩者的 區別在於, 前者DBMS將直接跳到第一個DEPT等於4的記錄而後者將首先定位到DEPT NO=3的記錄並且向前掃描到第一個DEPT大於3的記錄.

(5)LIKE操作符:LIKE操作符可以應用通配符查詢,裏面的通配符組合可能達到幾乎是任意的查詢,但是如果用得不好則會產生性能上的問題,如LIKE ‘%5400%’這種查詢不會引用索引,而LIKE‘X5400%’則會引用範圍索引

(6)用EXISTS替換DISTINCT: EXISTS使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足後,立刻返回結果 (低     效):SELECTDISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D , EMP EWHERE D.DEPT_NO = E.DEPT_NO (高效):SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHEREEXISTS   (SELECT‘X‘FROM EMP EWHERE E.DEPT_NO = D.DEPT_NO);

(7)用UNION替換OR (適用於索引列):用UNION替換WHERE 子句中的OR 將會起到較好的效果.對索引列使用OR 將造成全表掃描 (高效): SELECT LOC_ID,LOC_DESC,REGIONFROM LOCATION WHERE LOC_ID =10   UNIONSELECT LOC_ID , LOC_DESC , EGIONFROM LOCATION WHERE REGION =‘MELBOURNE‘ (低效): SELECT LOC_ID,LOC_DESC,REGIONFROM LOCATION WHERE LOC_ID= 10OR REGION = ‘MELBOURNE‘ 如果你堅持要用OR, 那就需要返回記錄最少的索引列寫在最前面.

(8)用IN來替換OR: 低效: SELECT….FROM LOCATION WHERE LOC_ID =10OR LOC_ID=20OR LOC_ID=30 高效: SELECT…FROM LOCATION WHERE LOC_IN IN (10,20,30);

3、SQL語句結構優化

(1)、SELECT子句中避免使用‘ * ‘:

(2)、用TRUNCATE替代DELETE :

(3)、用Where子句替換HAVING 子句:

(4)、sql語句用大寫 因為oracle 總是先解析sql語句,把小寫的字母轉換成大寫的再執行。

(5)、在Java代碼中盡量少用連接符“+”連接字符串!

(6)、避免改變索引列的類型.:

7、優化GROUP BY: 提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY之前過濾掉.下面兩個 低效: 1SELECT JOB,AVG(SAL)FROM EMP GROUPby JOBHAVING JOB= ‘PRESIDENT‘ OR JOB =‘MANAGER‘

高效: 1SELECT JOB,AVG(SAL)FROM EMP WHERE JOB =‘PRESIDENT‘OR JOB=‘MANAGER‘GROUPby JOB

數據庫優化方案