SQL優化【基礎08】 - 耗能SQL分析一般流程思路

最近常有網友問起耗能分析的思路,有時轉來轉去的,較浪費時間,這裏小結下;結合實例講解;


SQL>   select * from v$version;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

1. 如下這條SQL,它有沒有什麼問題,能不能優化?


2.很簡單看下計劃即可(這裏有些人會問到有些跑很久纔會出結果,所以你可以跑上10來S,然後ctrl+c中斷看一個時間段即可)

如下我們可以看到,這條SQL存在兩個表的全表掃描,時間上還是很快的(0.02),邏輯讀2079,結合predicate information信息

自然會產生一個疑問,object_id有無索引?是否適合建索引?從最後的NOTE中也可以意識到,這條SQL中的涉及對象存在沒有統計

信息的情況;


3.運行sosi命令也可以分別看到T1,T2類似的情況,沒有統計信息;


4.進行統計收集,當然如果生產上時候不能做,你也可以通過select count( distinct object_id) from t1 ; 這樣的方式,只是比較麻煩;


5.通過查看可以看到全錶行數72624,object_id的唯一值的不重複數爲72624-4=72620(扣去空值4,可見選擇率相當的好);



6.T2的表也類似



7.接下來就順理成章的創建索引,然後查看計劃可以看到,時間變爲0.01,邏輯讀也從之前的2079->6;


SQL> create index idx_t1_id on t1(object_id);
SQL> create index idx_t2_id on t2(object_id);
SQL>




8.當然以上只是一個很簡單的例子,在實際的生產環境中會更復雜;

比如:

1.有些變量很快,有些變量又存在很慢 解決方法:=>建立直方圖 or  綁定計劃(這個計劃是通用的) ?

2.有些根據它SQL的寫法和需要就非得全表掃描一個幾十萬的表  =>解決辦法:減少頻率,分區,修改業務邏輯等

3.有些是系統的參數要調整:如一個習慣使用parallel的HINT的系統,parallel_max_servers卻設置的過小,那麼你就需要結合CPU和IO進行調整;

4.有些是模型問題,比如明明物化視圖能解決的,你非要用普通視圖,那執行的速度上是可想而知的;

5.有些是SQL的寫法上引起的,這種的解決要結合業務進行調整等價改寫即可;

6.有些是執行頻率過大,執行的時間段可以調整的也可以根據實際情況進行相應的調整;

7.還有些是執行計劃上的改變引起的,那麼你可以採用暫時固定計劃的方式解決(baseline,sql profile);
8. and other ........



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章