一.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