Oracle 如何提高dbms_stats.gather_schema_stats的性能

Oracle 如何提高dbms_stats.gather_schema_stats的性能,oracle,oracle11g,database-performance,Oracle,Oracle11g,Database Performance,使用下面的块收集架构统计数据花费了16.30小时。 有没有办法提高绩效 begin dbms_stats.gather_schema_stats( ownname => 'SCHEMA_NAME', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size AUTO', cascade

使用下面的块收集架构统计数据花费了16.30小时。 有没有办法提高绩效

begin
   dbms_stats.gather_schema_stats(
      ownname          => 'SCHEMA_NAME',
      estimate_percent => dbms_stats.auto_sample_size,
      method_opt       => 'for all columns size AUTO',
      cascade          => true, 
      degree           => 16
   );
end;
此活动每周执行一次,但等待16小时对用户来说是不合适的

我的Oracle db是11.2.0版,模式中有几个大分区表,数据插入/删除频繁发生的地方。

考虑一个额外的参数
选项
,该参数的
自动收集
值介于
ownname
estimate_percent
之间,以便仅收集没有统计信息或行更改超过10%的表的统计信息,以缩短时间段,顺便说一下,将
estimate\u percent
参数保留为
dbms\u stats.auto\u sample\u size
,因为数据库会自动为您估计值:


是否始终需要重新计算整个架构的统计信息?您还可以对单个表或分区甚至单个列执行聚集统计。将“聚集统计信息”限制为数据已显著更改的对象


在数据没有变化的情况下,收集表/分区的统计数据没有任何意义。

是否对分区表使用增量统计数据?默认情况下,Oracle会自动收集统计数据。通常不需要手动触发它们。如果此自动收集无法满足您的需要,您是否检查了
所有表中上次分析的
所有选项卡分区中的
视图,我检查了少数分区表的最后一个\u分析字段,它是sysdate-7天。我不确定如何获取分区表的增量统计数据。请指导我最佳时效方法的步骤,因此,即使分区表中的数据进一步增加,我们也不需要担心收集统计数据作业的时间消耗。很难确定数据总是在哪个表中更改。因此,我们每周收集整个模式的统计数据。你的意思是分区表的聚集统计数据应该在执行聚集模式统计之前单独完成。我认为你应该非常了解你的应用程序,你可以发现哪些数据经常更改。感谢你的评论,我注意到有近50个会计分区表经常进行数据操作,这些大表花费了将近13个小时的大量时间,剩下的1500个表只花了3.5个小时。请建议收集整个模式统计数据的最佳方法或我们需要采用的任何其他方法。谢谢Barbaros。只有选项参数需要修改,或者其他一些参数,比如并行度,也需要修改,因为其中涉及到一些分区表。@Santu。不客气。对于中型DBMS(可能是大型企业)来说,值16似乎太大了。此外,您可以切换一周的
GATHER EMPTY
(仅计算没有统计信息的表的统计信息)和一周的
GATHER STALE
(仅计算行更改超过10%的表的统计信息),以进一步缩短操作的持续时间。
begin
   dbms_stats.gather_schema_stats(
      ownname          => 'SCHEMA_NAME',
      options          => 'GATHER AUTO',
      estimate_percent => dbms_stats.auto_sample_size,
      method_opt       => 'for all columns size AUTO',
      cascade          => true, 
      degree           => 16
   );
end;
/