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 ;
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)