oracle group by期间CPU利用率高

oracle group by期间CPU利用率高,oracle,oracle11g,Oracle,Oracle11g,我对甲骨文集团条款有疑问。 是否按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

我对甲骨文集团条款有疑问。 是否按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吗


提前感谢。

您正在使用聚合函数。如果表中有3200万行,并且您正试图聚合这些列中的所有值,那么您希望Oracle做什么? 无所事事地坐着

对这么多数据进行汇总需要时间

GROUPBY子句所用的时间取决于第1列到第8列中不同值的数量。 在执行GROUPBY之前,数据库首先必须检索这些列的所有值,然后按照您的要求“很好地”排序,然后插入它。此外,查询总体上看起来很糟糕。为什么要对每一列进行聚合求和,而在执行group by时可能会丢失值? 例如,如果在第1-8列中有重复的值,那么可能会无缘无故地多次计算总和*

由于您没有提供解释说明,简单的回答是,选择了这么多数据后,聚合“肯定需要相当长的时间”,小组成员取决于您的数据。如果Oracle不使用这么多CPU,我会感到惊讶,因为它只是基于从一个包含3200万条记录的表中检索结果所需的行数


如果看不到执行计划,就不可能说出在哪里花费了多少时间。

解释计划会很有趣,就像往常一样,如果您查询v$sql\u工作区,您将看到group by是否溢出到磁盘

重要的不仅是要查询的行数,还有要输出的行数和包含列的平均列宽,因为这在很大程度上决定了执行聚合需要多少内存,从而决定排序是否会溢出到磁盘。如果确实如此,则可能需要增加PGA内存分配,可以手动设置,也可以通过改变PGA总大小来设置。检查PGA和SGA缓冲区公告,查看它们的大小是否正常


您还可能成为服务器技术最新趋势的受害者,这些趋势通常以CPU为特征,而CPU的核心相对较弱。除非您运行并行查询,否则您将被限制在单个核心中。

如果没有进一步的信息,没有人能告诉您-特别是使用的SELECT的“查询计划”(即通过EXPLAIN生成)是查看实际情况所必需的…@Yahia问题不是关于最佳方法。我有兴趣了解oracle在分组方式和聚合方面的行为。甲骨文遵循的方法。这就是问题所在。从理论上讲,oracle做什么?这取决于几个方面,如可用RAM、配置(SGA等)、确切版本(DB、OS、ASM等)。无论特定版本的答案是什么,它都可以随任何补丁更改。。。你问的是一个“实现细节”,没有人能在没有源代码的情况下真正回答这个问题……这很公平。oracle是否在文档中提到cpu密集型操作?我不知道,但oracle有几千页,我肯定不知道完整的文档…很有趣。但我真的不关心查询的内存方面。我感兴趣的是cpu利用率。常识告诉我们,分组将是沉重的。但甲骨文是否在文档中提到过它?