在程序中包括表格收集统计信息

时间:2014-10-07 20:20:20

标签: oracle procedures

朋友们,我正在使用以下过程来移动每个表的表,索引,现在尝试在过程中包含dbms_stats.gather_table_stats。 无论如何我收集的数据不起作用。

有人可以建议我做错了吗?

过程接受两个参数OldTbs = Old Tablespace和NewTbs = New Tablespace。

逻辑我在追随; 环

  1. 从表空间移动一个表

  2. 在#1

  3. 中移动表移动的每个索引
  4. 收集在#1
  5. 中移动的表格的统计信息

    直到#2工作,现在尝试在表完成所有索引重建后包含dbms_stats。 用户有权移动任何架构。

    dmbs_stats.gather_table_stats(owner=>.......)
    
    
    CREATE OR REPLACE PROCEDURE moveTbl (OldTbs in varchar2, NewTbs in varchar2)
        AUTHID CURRENT USER
    IS
      CURSOR curTable IS
        SELECT owner, table_name, tablespace_name
          FROM dba_tables
          WHERE tablespace_name = OldTbs
          ORDER BY TABLE_NAME;
    
       CURSOR curIndex (lTabOwn IN Varchar2, lTabNan IN Varchar2) IS
          SELECT table_owner, table_name, owner, index_name, tablespace_name
            FROM dba_indexes
            WHERE table_owner = lTabOwn
            AND table_name = lTabNam;
    
    BEGIN
      FOR rec1 IN curTable LOOP
        dbms_output.putline(rec1.owner || '.' || rec1.table_name);
    
        EXECUTE IMMEDIATE 'alter table ' || rec1.owner || '.' || rec1.table_name ||
                          ' move tablespace ' || NewTbs;
    
      FOR rec2 IN curIndex LOOP
         .....
         .....
         .....
    
      END LOOP;  --curIndex for loop
    
      dmbs_stats.gather_table_stats(ownname=>'''||rec1.owner || ''',tabname=> || rec1.table_name ||''', estimate_percent=>100, cascade=>true);
    
      END LOOP;  --curTable for loop
    END moveTbl;
    

1 个答案:

答案 0 :(得分:2)

只需将所有者和表名作为参数传递即可。您没有构建动态SQL语句,因此没有理由引用任何内容

dbms_stats.gather_table_stats( ownname => rec1.owner,
                               tabname => rec1.table_name,
                               estimate_percentage => 100,
                               cascade => true );

当然,这并不会影响您正在编写的代码的基本智慧。如果您经常将对象从一个表空间移动到另一个表空间,以至于值得编写存储过程,我会强烈怀疑您做错了什么。除非你有大量的数据或非常奇怪的数据模式,估计百分比100似乎也是严重的过度杀伤。