Oracle手动更新所有表的统计信息

时间:2013-05-05 02:10:22

标签: oracle statistics

有没有办法更新所有表的所有统计信息而不管所有者?

我找到了这个小节目,但我不确定这是否能抓住所有桌子......

BEGIN
   FOR A IN ( SELECT owner FROM SYS.all_tables ) LOOP
      execute immediate
        EXEC dbms_stats.gather_schema_stats( 'A.owner', cascade='TRUE');
   END LOOP;
END;

3 个答案:

答案 0 :(得分:15)

答案 1 :(得分:10)

DBMS_STATS包一次最多只能处理一个架构。

您可以使用以下脚本收集所有架构中所有对象类型的统计信息。你列出的那个有几个问题(不用立即执行,`A.owner'是一个字符串,但它应该是一个对象,等等。)

您可以在IN列表中添加其他模式以跳过,因为您可能不希望为内置模式执行此操作(它们大部分都是静态的,因此它们会浪费)。此外,您需要为正在收集统计信息的每个模式具有适当的权限(或以DBA身份登录)。

收集所有对象的统计信息(可能是您真正想要的):

BEGIN
    FOR rec IN (SELECT * 
                FROM all_users
                WHERE username NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_schema_stats(rec.username);
    END LOOP;
END;

仅收集表格中的统计数据:

BEGIN
    FOR rec IN (SELECT * 
                FROM all_tables
                WHERE owner NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;

答案 2 :(得分:0)

我对@sehrope 过程进行了修改,以跳过锁定的统计信息和 IOT 表,因为它们将通过异常。

BEGIN
    FOR rec IN (SELECT a.owner, a.table_name 
                FROM all_tables a, dba_tab_statistics  s
                WHERE a.owner NOT IN ('SYS','SYSDBA')
                AND 
                (a.iot_type IS NULL
                OR
                a.iot_type != 'IOT_OVERFLOW')
                and a.owner = s.owner and a.table_name = s.table_name and s.STATTYPE_LOCKED is null)
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;