2011-05-12 98 views
2

我正在致力于一年前已升级到Oracle 10g(现在为10.2.0.5)的数据仓库系统。将workarea_size_policy设置为手动或自动

数据库设置为workarea_size_policy=autopga_aggregate_target=1G。大多数ETL过程都是用PL/SQL编写的,并且此代码通常设置为workarea_size_policy=manual,并在构建仓库的特定部分时为特定会话设置SORT_AREA_SIZEHASH_AREA_SIZE

对于构建的不同部分,为SORT_AREA_SIZEHASH_AREA_SIZE选择的值是不同的。这些大小可能基于每个区域将要处理的预期数据量。

我遇到的问题是这段代码开始导致一些ORA-600错误发生。这让我怀疑我们是否应该重写自动设置。

设置手动设置的代码是很多年前由不在此处的开发人员编写的。它最初可能是为Oracle 8编写的,并且针对Oracle 9进行了修改,以将workarea_size_policy设置为手动。没有人真正知道如何找到用于HASH_AREA_SIZE和SORT_AREA_SIZE的值。他们可能完全不适合我所知道的。

经过那段很长的序言,我有几个问题。

  1. 我怎么知道什么时候(如果有的话),我应该重写与WORKAREA_SIZE_POLICY =手动手动设置?
  2. 如何为HASH_AREA_SIZE,SORT_AREA_SIZE等找到合适的值?
  3. 我如何基准特定设置实际上提供任何形式的好处?

我知道这是一个相当广泛的问题,但帮助将不胜感激。

回答

1

我建议您注释掉手动设置并仅使用自动(动态)设置进行测试运行,如PGA_AGGREGATE_TARGET。 自Oracle 8开始,Sort和Hash内存区域的管理已经有了很大改进!

很难预先确定程序的内存需求,所以最好的做法是用代表性的数据量来测试它们,看看它是如何发展的。
然后,您可以创建涵盖执行过程的时间范围的AWR报告。报告中有一部分名为PGA内存咨询。这将告诉你,如果您需要更多的内存分配给PGA_AGGREGATE_TARGET,根据您当前的数据量。

sample here

PGA Memory Advisory sample

在这种情况下,你可以清楚地看到,没有必要去在所分配的当前103 MB,而你实际上可以留在52 MB,而不会影响应用程序。

根据我们正在讨论的卷,如果您不能分配更多内存,某些排序或哈希操作可能会溢出到TEMPORARY表空间,因此请确保您有适当大小的表,并且可能跨越很多磁盘/卷尽可能(请参阅SAME配置,也是here)。

+0

@kamai感谢您的回答。以为我永远不会得到一个!想想我知道手动设置现在基本上被禁止了(尤其是因为我们从Oracle的支持中获得了这些),但是很难获得大量的生产代码。基本上尝试量化这个的任何好处(除了更少的ORA-00600错误)将看PGA内存顾问。 – 2011-06-10 09:30:52

+0

@MikeyByCrikey不客气。如果这个答案有用,你能否将其标记为有用? – Kamal 2011-06-14 12:21:57

+0

对不起,延迟很长。最后将答案标记为正确(仅在回答后两个月)。我想我知道我不应该再使用'HASH_AREA_SIZE'和'SORT_AREA_SIZE',但很难通过任何真正的理由来改变现有的代码。 – 2011-08-07 11:33:36