首页 文章

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

提问于
浏览
0

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

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

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

逻辑我在追随;环

  • 从表空间移动一个表

  • 在#1中移动表移动的每个索引

  • 收集在#1中移动的表的表统计信息

直到#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 回答

  • 2

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

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

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

相关问题