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

Tom*_*Tom 17 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;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 16

exec DBMS_STATS.GATHER_DATABASE_STATS ;

  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (3认同)
  • @SysDragon我的回答是功能和链接.我添加了一个`exec`和`;`来使它更清晰. (3认同)

seh*_*ope 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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)