有没有办法更新所有表的所有统计信息而不管所有者?
我找到了这个小节目,但我不确定这是否能抓住所有桌子......
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;
答案 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;