【analyze】使用PL/SQL 方法完成多用户数据分析

曾经在下面文章中介绍过使用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 --

请使用浏览器的分享功能分享到微信等