【analyze】使用PL/SQL 方法完成多使用者資料分析

secooler發表於2010-03-06
曾經在下面文章中介紹過使用SQL指令碼方法完成資料分析的內容。
《【實驗】【analyze】分析特定使用者的表和索引》
http://space.itpub.net/519536/viewspace-613551

這篇文章我來將這些分析動作都封裝在一個PL/SQL塊中,以便達到指令碼的簡潔和易用的目的。

1.編寫的指令碼內容如下
DECLARE
   v_sqlstring   VARCHAR2 (500);
BEGIN
   FOR rec IN (SELECT owner, table_name
                 FROM all_tables
                WHERE owner IN ('SECOOLER', 'SEC', 'HOU'))
   LOOP
      BEGIN
         v_sqlstring :=
               'begin dbms_stats.gather_table_stats ( wnname => '''
            || rec.owner
            || ''', tabname => '''
            || rec.table_name
            || ''',estimate_percent => null, '
            || 'method_opt => ''FOR ALL COLUMNS SIZE 254'', '
            || 'degree => 6, cascade => TRUE); end;';
         DBMS_OUTPUT.put_line (v_sqlstring);

         EXECUTE IMMEDIATE v_sqlstring;
      END;
   END LOOP;
END;
/


【注意】在構造分析語句的時候,注意要以“begin”開頭。

2.指令碼執行效果
sys@ora10g> DECLARE
  2     v_sqlstring   VARCHAR2 (500);
  3  BEGIN
  4     FOR rec IN (SELECT owner, table_name
  5                   FROM all_tables
  6                  WHERE owner IN ('SECOOLER', 'SEC', 'HOU'))
  7     LOOP
  8        BEGIN
  9           v_sqlstring :=
 10                 'begin dbms_stats.gather_table_stats ( wnname => '''
 11              || rec.owner
 12              || ''', tabname => '''
 13              || rec.table_name
 14              || ''',estimate_percent => null, '
 15              || 'method_opt => ''FOR ALL COLUMNS SIZE 254'', '
 16              || 'degree => 6, cascade => TRUE); end;';
 17           DBMS_OUTPUT.put_line (v_sqlstring);
 18
 19           EXECUTE IMMEDIATE v_sqlstring;
 20        END;
 21     END LOOP;
 22  END;
 23  /

begin dbms_stats.gather_table_stats ( wnname => 'SECOOLER', tabname => 'T',estimate_percent => null, method_opt => 'FOR ALL COLUMNS SIZE 254', degree => 6, cascade => TRUE); end;
…… 省略 ……
begin dbms_stats.gather_table_stats ( wnname => 'SEC', tabname => 'T_SEC',estimate_percent => null, method_opt => 'FOR ALL COLUMNS SIZE 254', degree => 6, cascade => TRUE); end;
…… 省略 ……
begin dbms_stats.gather_table_stats ( wnname => 'HOU', tabname => 'T_HOU',estimate_percent => null, method_opt => 'FOR ALL COLUMNS SIZE 254', degree => 6, cascade => TRUE); end;
…… 省略 ……

PL/SQL procedure successfully completed.


3.小結
這個分析指令碼是可以隨心所欲去定製的。例如,調整需要分析的使用者名稱、調整dbms_stats.gather_table_stats分析指令碼的引數亦或記錄更多有意義日誌資訊等。
維護指令碼最大的好處就是隨需而變,當遇到一個較複雜的需求的時候,可以考慮編寫一段得心應手的指令碼來提高效率。
自動化,簡潔,高可控性都是我們追求的目標。

Good luck.

secooler
10.03.06

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-628807/,如需轉載,請註明出處,否則將追究法律責任。

相關文章