0

我对 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 吗?

提前致谢。

4

2 回答 2

2

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

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

您也可能成为服务器技术最新趋势的牺牲品,这些趋势通常具有带有许多相对较弱内核的 CPU。除非您正在运行并行查询,否则您将被限制在一个内核中。

于 2013-06-21T10:55:59.707 回答
-1

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

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

group by 子句所花费的时间取决于第 1 到 8 列中不同值的数量。在执行 group by 之前,数据库首先必须检索这些列的所有值,然后像您一样“很好地”对其进行排序已请求,然后插入它。此外,查询通常看起来很糟糕。为什么您要对每一列进行汇总总和,只是在进行分组时可能会丢失值?例如,如果您在第 1-8 列中有重复值,则总和 *可能会无缘无故地计算多次。

由于您没有提供解释声明,因此简单的答案是,选择这么多数据后,分组依据“肯定会花费大量时间”,这取决于您的数据。如果 Oracle 不使用这么多 CPU,我会感到惊讶,这仅仅是基于您从具有 3200 万条记录的表中检索结果所必须经历的行数。

如果没有看到执行计划,就不可能说出什么时间花在了哪里。

于 2013-06-21T10:07:48.803 回答