2014-10-07 172 views
0

朋友,我正在使用以下过程来移动表,每个表的索引,现在尝试在过程中包含dbms_stats.gather_table_stats。 不知怎的,无论我做什么收集统计不工作。在过程中包含表收集统计信息

请问有人可以建议我做错了什么?

过程接受两个参数OldTbs =旧的Tablespace和NewTbs =新的表空间。

逻辑我在追随; 环路

  1. 移动一个表中从表空间

  2. 移动在#1

  3. 每个索引表移动收集表中的表的统计信息将其在#移动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

只需传递所有者和表名称作为参数。你并没有建立一个动态的SQL语句,所以没有理由引用任何东西

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

当然,这不会看到你正在编写的代码的基础智慧。如果您经常将对象从一个表空间移动到另一个表空间,以至于值得编写一个存储过程,我会强烈怀疑您做的事情是非常错误的。除非您的数据量不大或者数据模式非常奇怪,否则100的估算百分比似乎也是严重的过度消耗。

+0

感谢贾斯汀的工作,相当长一段时间,我无法得到它的工作,所以最终决定得到专家的帮助。是的,我认为,因为我引用了复杂的东西。我有一个包含各种程序和使用包来移动对象的包,数据大小大于3TB。我也会将估算比例降低到10%左右。 – homer 2014-10-07 20:41:26

+0

@homer - 你为什么首先将3TB的数据从一个表空间转移到另一个表空间?这似乎很可疑。根据你的Oracle版本,我建议让Oracle选择样本大小'dbms_stats.auto_sample_size'。不过,对于那么多的数据来说,除非统计数据一开始就是狡猾的,否则我只是将它们保存起来并在移动之后导入它们,而不是承担收集它们的所有成本。当然,我通常不会将表格移动到不同的表空间中。 – 2014-10-07 20:48:57

+0

版本Oracle 11gR2,很棒.. auto_sample_size将会比,会为此手动读取。我只是按照要求对旧表空间进行清理。 – homer 2014-10-07 20:55:18