https://baijiahao.baidu.com/s?id=1609391382597168099&wfr=spider&for=pc
1、ORACLE 優化內容
根據業務分析人員、設計人員、應用程序開發人員、數據庫管理員、系統管理員幾個不同的角色,針對每個不同角色,進行針對性的內容優化。
2、怎樣寫好SQL語句
(1)、 儘量簡單,模塊化
(2)、易讀、易維護
(3)、節省資源
(4)、 內存
(5)、CPU
(6)、 掃描的數據塊要少
(7)、少排序
(8)、不造成死鎖 ( 檢查是否被鎖:v$locked_object )
3、SQL優化的一般性原則
(1)、目標:
減少服務器資源消耗(主要是磁盤IO);
(2)、設計方面:
合適的索引,索引的雙重效應,列的選擇性;
(3)、編碼方面:
利用索引,避免大表FULL TABLE SCAN;
合理使用臨時表;
避免寫過於複雜的sql,不一定非要一個sql解決問題;
在不影響業務的前提下減小事務的粒度;
4、優化概括(SQL語句基本原則)
● 查詢儘量用確定的列名,少用*號。
select * from bdc_zc_qs;
性能優化後的語句: select bzm_qs,ywh,… from bdc_zc_qs;
● 儘量少嵌套子查詢,這種查詢會消耗大量的CPU資源;
● 比較多or運算的查詢能使用union all 替換 or運算,建議分成多個查詢,用union all聯結起來;
● 多表查詢選擇最有效率的表名順序;
oracle解析器對錶解析從右到左,所以記錄少的表放在右邊;
● 儘量多用commit語句提交事務,可以及時釋放資源、解鎖、釋放日誌空間、減少管理花費;
● 儘量避免使用dblink訪問數據庫,使用dblink會產生數據上的網絡交互,極大影響性能;
● union all 替換union,union 原理是把兩個集合union all起來在進行排序去重複;
● 儘量不要使用distint,distinct會產生排序;
● 視圖儘量不要使用order by;
● 避免在索引列上使用函數,計算等;
● 避免在索引列上使用not條件;
● 注意查詢列字段類型,避免索引列自動轉換;
例如:select * from bdc_zc_qs qs where qs.ywh=666,這種情況oracle會轉換成to_number(qs.ywh)=666
● 用not exists 替代not in;
● 符號運算使用順序:=、>=、>、<>;
● 使用where條件時候把最優的條件放最後,oracle採用自下而上的順序解析WHERE子句,根據這個原理, 當在where 子句中有多個表聯接時,where 子句中排在最後的表應當是返回行數可能最少的表,有過濾條件的子句應放在where 子句中的最後。
5、SQL語句優化的過程
(1)、定位有問題的語句;
(2)、檢查執行計劃;
(3)、 檢查執行過程中優化器的統計信息;
(4)、分析相關表的記錄數、索引情況;
(5)、 改寫SQL語句、使用HINT、調整索引、表分析;
(6)、有些SQL語句不具備優化的可能,需要優化處理方式;
6、SQL語句執行過程
7、SQL語句處理過程