1. 程式人生 > >SQL訪問顧問SAA(SQL Access Advisor)理論部分十一:生成SQL指令碼

SQL訪問顧問SAA(SQL Access Advisor)理論部分十一:生成SQL指令碼

生成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');