oracle组中的高CPU利用率

时间:2013-06-21 09:48:00

标签: oracle oracle11g

我对oracle group by 子句有疑问。 是否由CPU密集型操作组?

我们对一个包含32M行且没有索引列的表进行查询,该列在7-8列上进行分组,在3列上进行聚合并插入到另一个表中。有时我们看到oracle进程使用的总CPU为100%。

查询看起来像这样:

insert into temp_table select col1, col2, col3, col4, col5, col6, col7, col8,
 sum(col10), sum(col11), count(*) from orig_table group by col1, col2, 
 col3, col4, col5, col6, col7, col8 ;

据我的理解, 要分组,我们必须排序然后分组。这会导致高CPU利用率吗?那么,聚合呢?它们会导致高CPU吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

解释计划一如既往地会很有趣,如果您查询v $ sql_workarea,您将看到该组是否溢出到磁盘。

不仅要查询的行数很重要,而且还要输出的行数和包含列的平均列宽,因为这很大程度上决定了执行聚合,因此排序是否会溢出到磁盘。如果是,那么您可能需要增加PGA内存分配,手动设置或通过改变总PGA大小。检查PGA和SGA缓冲器的建议,看看它们的尺寸是否合适。

您可能也会成为服务器技术最近趋势的牺牲品,服务器技术往往具有许多相对较弱的核心CPU。除非您运行并行查询,否则您将被限制在单个核心。

答案 1 :(得分:-1)

您正在使用聚合函数。如果表有3200万行,并且您正在尝试聚合这些列中的所有值,那么您期望Oracle做什么? 坐在空闲状态?

关于这么多数据的汇总需要时间!!!

group by子句所用的时间取决于第1列到第8列中不同值的数量。 在执行group by之前,数据库首先必须检索这些列的所有值,然后对它进行排序"很好地"按照您的要求,然后插入它。此外,查询一般看起来很糟糕。为什么要对每一列进行总和,只是在进行分组时可能会丢失值? E.G如果您在第1-8列中有重复值,则无理由多次计算总和* *

由于您没有提供任何解释性陈述,因此简单的答案是,如果选择了这么多数据,那么聚合"肯定会占用大量时间。 group by取决于您的数据。如果Oracle没有使用这么多CPU,我只会根据您需要通过从具有32Million记录的表中检索结果的行数来使用这个CPU。

如果没有看到执行计划,就无法确定在哪里花费的时间。