【问题标题】:Oracle manually update statistics on all tablesOracle 手动更新所有表的统计信息
【发布时间】:2013-04-29 03:29:01
【问题描述】:

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

我找到了这个片段,但我不确定这是否会抓取所有表格......

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;

【问题讨论】:

  • 从 SYS.all_tables 中选择不同的所有者

标签: oracle statistics


【解决方案1】:

我对@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;

【讨论】:

    【解决方案2】:

    使用DBMS_STATS.GATHER_DATABASE_STATS:

    begin
        dbms_stats.gather_database_stats;
    end;
    /
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @SysDragon 我的回答既是函数又是链接。我添加了exec; 以使其更清晰。
    • 正如预测的那样,链接已损坏。
    • @PecosBill 感谢您修复链接!似乎 Oracle 每隔几年就会断开指向其文档的链接,我需要检查很多其他答案。
    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多