oracle 性能優化 06_sql優化

一.SQL優化概述
1.查找須要優化的TOP SQL,能夠經過AWR報告,v$sql,v$sqlarea視圖獲取,CPU開銷,邏輯讀,物理讀,執行次數,
    解析次數,執行時間等
2.優化可能的選擇
    合理使用索引  索引的選擇性
    多表連接的順序,多表複雜鏈接拆分進行,將複雜SQL語句使用PL/SQL完成,ordered固化鏈接順序
    使用臨時表,在過程當中完成SQL操做,一次訪問屢次使用
    大批量數據操做盡量使用BULK操做  forall
    優化相關表的存儲結構
    數據歸檔
    表和索引分析策略調整
    調整SQL執行時間窗口
    限制數據查詢範圍
    儘量分拆過大的SQL  過程替代SQL
    注意綁定變量的使用 狀態,性別類不適合使用綁定變量
    優化應用架構對應用性能影響深遠
3.優化的注意事項
    風險考慮,收集基線狀況,備份回退方案。
4.SQL編寫原則
    寫簡單的SQL
    只選出須要的字段
    若是SQL的邏輯太複雜,拆分爲多個SQL,經過一個PL/SQL對象來實現
    經過臨時表來減小SQL的開銷
    不要使用佔位操做 佔位符可能影響優化器的執行計劃
    適當使用綁定變量
    完整的註釋
    不要把全部操做都交給數據庫服務器去作
    儘量將表達式計算好 where a>1.2*3+1  ==> where a>7.6
    不要作隱式類型轉換 where a=123   ==> where a='123'
    子查詢的時候注意IN和EXISTS的使用 若是子查詢的過濾條件強就用In,若是父查詢的過濾條件強就用exists
    使用函數索引,組合索引,位圖索引的使用
    使用HINT來固化執行計劃,http://blog.csdn.net/tianlesoftware/article/details/4969702
    對於小表,能夠放入KEEP緩衝池中,進行全表掃描,而不要經過索引訪問
    使用表分區和索引分區技術,下降訪問大型對象的開銷
    按期對索引進行重建,恢復索引的性能
2、SQL分析優化工具
1.執行計劃進行開銷分析,參見執行計劃解析
2.PL/SQL分析工具PROFILER
    安裝PROFILER
    /u01/app/oracle/product/10.2.0/db_1/rdbms/admin/profload.sql --sysdba執行
    /u01/app/oracle/product/10.2.0/db_1/rdbms/admin/proftab.sql  --調試用戶執行
    調試對應PL/SQL程序
    declare 
        err number; 
    begin 
        err:=DBMS_PROFILER.START_PROFILER ('SEQ CACHE IS 1k '); 
        testseq(20000);--PL/SQL程序
        err:=DBMS_PROFILER.STOP_PROFILER ; 
    end; 
    格式化輸出調試結果:
    column RUN_COMMENT format a40 truncate;
    select runid, run_date, RUN_COMMENT from plsql_profiler_runs order by runid; 
    column unit_name format a15 truncate;
    column occured format 999999 ;
    column line# format 99999 ;
    column tot_time format 999999.999999 ;
    
    select p.unit_name, p.occured, p.tot_time, p.line# line,  
           substr(s.text, 1,75) text 
      from  
           (select u.unit_name, d.TOTAL_OCCUR occured,  
                   (d.TOTAL_TIME/1000000000) tot_time, d.line# 
              from plsql_profiler_units u, plsql_profiler_data d 
             where d.RUNID=u.runid and d.UNIT_NUMBER = u.unit_number 
               and d.TOTAL_OCCUR >0 
               and  u.runid= &RUN_ID) p,   
           user_source s 
     where p.unit_name = s.name(+) and  p.line# = s.line (+)  
     order by p.unit_name, p.line#; 
3.SQL Tuning Advisor
    DECLARE
      my_task_name VARCHAR2(30);
      my_sqltext CLOB;
    BEGIN
      my_sqltext := 'SELECT * '   ||
                    'FROM scott.emp ' || 'WHERE job_id = 'HR_REP' AND ' || 'salary = 6000 ';
    
      my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
                               sql_text => my_sqltext,
                               user_name => 'SH',
                               scope => 'COMPREHENSIVE',
                               time_limit => 60,
                               task_name => 'TEST_sql_tuning_task',
                               description => 'Sample Task');
    END;
    Execute dbms_sqltune.Execute_tuning_task (task_name => 'TEST_sql_tuning_task');
    select dbms_sqltune.report_tuning_task('TEST_sql_tuning_task') from dual;
4.SQL PERFORMANCE ANALYZER(SPA)
    捕獲相關SQL造成SQL tuning set,改前性能評估,修改,改後評估
    手動和EM兩種方式    
 sql

相關文章
相關標籤/搜索