2013-05-05 50 views
12

有没有办法更新所有表的所有统计信息,无论拥有者是谁?Oracle手动更新所有表上的统计信息

我发现这个sniplet,但我不知道这是否会抓住所有表....

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; 
+1

SELECT DISTINCT所有者FROM SYS.all_tables – 2013-10-12 10:53:17

回答

7

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; 
13
+3

虽然此链接可能回答此问题,但最好在此处包含答案的基本部分并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – SysDragon 2013-05-06 07:19:23

+2

@SysDragon我的答案既是功能又是链接。我添加了一个'exec'和';'使其更加清晰。 – 2013-05-06 18:38:21

+0

并且如预测的那样,链接被破坏。 – 2014-12-04 16:17:48

相关问题