收集一些Oracle表的统计信息需要很长时间。这些表的记录数从200万条记录到900万条记录。这些表每个都有大约5-6个索引。
Oracle版本
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
"CORE 10.2.0.1.0 Production"
TNS for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Productio
NLSRTL Version 10.2.0.1.0 - Production
聚集统计信息语法是
dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME', estimate_percent => 100, method_opt => 'for all columns size auto', cascade => true);
我们无法更改上述gather stats命令的参数,因为应用程序供应商坚持使用这些参数。
如果我们可以做些什么来减少收集统计工作所花费的时间,请告诉我。我注意到JOB在运行时会导致应用程序性能降低一点,这是不可接受的。
我还注意到有些表在磁盘上占用了大量空间,但实际数据(通过估计记录计数乘以平均行长度)要小得多。看起来这些表需要压缩/收缩/高水位重置等。
例如,某些表在磁盘上占用9 GB,但实际数据显示为1.2 GB。 。 。在破碎中浪费了近70%的空间。
ALTER TABLE Shrink是否会减少在表上收集统计信息所需的总时间?是推荐吗?
答案 0 :(得分:3)
是的,缩小空间会有所帮助。如果您能够将应用程序暂停一段时间,并且表格不会直接反弹到之前的大小,那么缩小空间总是一个好主意。
除此之外,如果参数不能改变,那么你可以做的事情并不多。在某些情况下,设置DEGREE
参数可以显着提高性能。我知道你说你不能改变任何参数,但我不知道他们怎么会抱怨那个。虽然它可能会使作业运行得更快,但它可能会对系统性能产生更大的影响(但时间更短)。
最好的解决方案可能是升级到11g,任何理智的应用程序都会使用estimate_percent => dbms_stats.auto_sample_size
。 11g中的统计数据收集多优于10g。借助improved auto sample algorithms,incremental statistics,setting statistics preferences和concurrent statistics等功能,收集统计信息的速度通常更快,更准确。