SQL訪問顧問SAA(SQL Access Advisor)理論部分十一:生成SQL指令碼
阿新 • • 發佈:2018-12-19
生成SQL指令碼
一種檢視建議的替代方法就是查詢元資料,它將使用dbms_advisor.task_script過程來為SQL語句創 建建議指令碼。最終指令碼是一個可以執行的SQL檔案,它可能包含drop,create和alter語句。對於新對 象,物化檢視名字,物化檢視日誌名與使用使用者定義模板自動生成的索引。你也能在試圖執行它之前 生成SQL指令碼。
這裡有四個任務引數控制著命名規則(mview_name_template與index_name_template),這些物件的所 有者(def_index_owner與def_mview_owner)與表空間(def_mview_tablespace與 def_index_tablespace)。
下面的例子顯示瞭如何生成包含建議的CLOB:
execute dbms_advisor.create_file(dbms_advisor.get_task_script ('MYTASK'),'ADVISOR_RESULTS', 'advscript.sql');
為了儲存指令碼檔案,必須提供目錄路徑,因此dbms_advisor.create_file過程需要知道指令碼儲存位置 。另外,必須要對這個目錄持有讀寫許可權。下面的例子顯示瞭如何儲存一個CLOB型別的指導指令碼檔案
SQL> create directory advisor_results as '/bak'; Directory created SQL> grant read,write on directory advisor_results to public; Grant succeeded SQL> execute dbms_advisor.create_file(dbms_advisor.get_task_script ('JYTASK'),'ADVISOR_RESULTS', 'jy_advscript.sql'); PL/SQL procedure successfully completed
下面是由這個過程生成的指令碼內容的一部分。這個指令碼包含了對建議訪問結構收集統計資訊的呼叫並 且在最後將建議標記為implemented。
Rem Access Advisor V10.1.0.0.0 - Production Rem Rem Username: SH Rem Task: MYTASK Rem Execution date: 15/04/2005 11:35 Rem set feedback 1 set linesize 80 set trimspool on set tab off set pagesize 60 whenever sqlerror CONTINUE create materialized view log on "sh"."products" with rowid, sequence("prod_id","prod_subcategory") including new values; alter materialized view log force on "sh"."products" add rowid, sequence("prod_id","prod_subcategory") including new values; .. create materialized view "sh"."mv$$_00510002" refresh fast with rowid enable query rewrite as select sh.customers.cust_state_province c1, count(*) m1 from sh.customers where (sh.customers.cust_state_province = 'ca') group by sh.customers.cust_state_province; begin dbms_stats.gather_table_stats('"sh"', '"mv$$_00510002"', null, dbms_stats.auto_sample_size); end; /
如何不再需要建議
dbms_advisor.reset_task過程可以將一個任務重新設定為初始啟動狀態。這將會刪除所有建議和任 務的中間資料。任務的實際狀態被設定為initial。語法如下:
dbms_advisor.reset_task (task_name in varchar2);
下面的例子將任務MYTASK進行重設定:
execute dbms_advisor.reset_task('mytask');