在Oracle數據庫出現性能問題時,使用Oracle本身的工具包,給出合理的調優建議是比較省力的做法。
下面兩種包的介紹及具體做法。
SQL Tuning Advisor 粒度最小的調整工具.
將一條或多條SQL語句做爲輸入內容,分析所有訪問路徑,然後生成改進SQL語句的建議,並提出索引,物化視圖和分區方案來提高應用程序的總體性能。
另外,在維護窗口中,Oracle也會針對Automatic Workload Repository(AWR) 來確定和記錄的高負載語句自動化運行SQL Tuning Advisor
SQL Access Advisor
它涉及工作量中所有SQL語句,並提出索引,特化視圖和分區方案來提高應用程序的總體性能。
小區別:
SQL Tuning Advisor 分別調整每條SQL語句(我之前的博文已經介紹這種方式如何使用)
SQL Access Advisor 同時調整所有SQL語句
SQL Access Advisor:
使用 dbms_advisor.quick_tune來對單個SQL語句進行調整
它的執行很像SQL Tuning Advisor,但執行的分析層次卻深入得多,生成的建議也更多。
1. 指定一個存放輸出文件的目錄
1 2 | --輸出文件目錄 create directory tune_scripts as '/demo/tune_scripts' ; |
2.採集,分析並給出建議
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | declare v_task_name VARCHAR2( 255 ); v_sql_stmt VARCHAR2( 4000 ); v_tune_sql_filename VARCHAR2( 255 ); v_cfile_directory VARCHAR2( 255 ); begin v_sql_stmt := 'select * from demo.txcl t where t.id = :1 ' ; v_task_name := 'tune_demo_txcl' ; v_tune_sql_filename := 'tune_demo_txcl.sql' ; v_cfile_directory := 'TUNE_SCRIPTS' ; dbms_stats.gather_table_stats( ownname => 'DEMO' , tabname => 'TXCL' , cascade => true ); --dbms_advisor.reset_task(v_task_name); --分析並得到建議 dbms_advisor.quick_tune(DBMS_ADVISOR.SQLACCESS_ADVISOR, v_task_name, v_sql_stmt); --將建議輸出到指定文件中 -- select * from dba_advisor_actions where task_name = 'tune_demo_txcl' ; -- select * user_advisor_sqla_wk_stmts where task_name = 'tune_demo_txcl' ; dbms_advisor.create_file( dbms_advisor.get_task_script(v_task_name), v_cfile_directory, v_tune_sql_filename ); --刪除任務 dbms_advisor.delete_task(v_task_name); exception when others then dbms_output.put_line(sqlerrm); end;
|
常見錯誤:
ORA-13600: error encountered in Advisor
QSM-00794: the statement can not be stored due to a violation of the invalid table reference filter
原因是dbms_advisor.quick_tune不支持爲SYS和SYSTEM兩個用戶的表的顧問功能,所能要分析的表不要用這兩個用戶建。
官網相關文檔:
https://docs.oracle.com/cd/E11882_01/server.112/e16638/advisor.htm#PFGRF94881