我对甲骨文逐条有疑问。组是否由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吗?
提前谢谢。
发布于 2013-06-21 10:55:59
与往常一样,解释计划会很有趣,如果您查询v$sql_workarea,您将看到组by是否溢出到磁盘。
重要的不仅是要查询的行数,还包括将要输出的行数和包含的列的平均列宽度,因为这在很大程度上决定了执行聚合所需的内存,因此排序是否会溢出到磁盘。如果是这样,那么您可能需要增加PGA内存分配,要么手动设置,要么改变PGA的总大小。检查PGA和SGA缓冲区通知,以确定它们是否一般大小良好。
您还可能成为服务器技术最新趋势的牺牲品,服务器技术通常以CPU的CPU为特征,而CPU的内核相对较弱。除非您正在运行并行查询,否则您将被限制在单个核心上。
发布于 2013-06-21 10:07:48
您正在使用聚合函数。如果表有3200万行,并且试图聚合这些列中的所有值,那么您期望Oracle做什么?坐在懒散的状态?
对这么多数据进行汇总将需要时间!
group by子句所用的时间取决于第1列到第8列中不同值的数量。在执行group by之前,数据库首先必须检索这些列的所有值,然后按照您的请求对其排序“很好”,然后插入它。此外,通常情况下,查询看起来很糟糕。为什么要对每一列进行汇总和,但在执行组时可能会丢失值?例如,如果在第1-8列中有重复的值,则可以无缘无故地多次计算和*。
由于您没有提供任何解释声明,简单的回答是,在选择了这么多数据之后,聚合“肯定会花费大量的时间”,这个组依赖于您的数据。如果Oracle没有使用这么多CPU的话,我会感到惊讶的是,仅仅基于您需要经过的行数,就可以从拥有3200万条记录的表中检索结果。
如果不看执行计划,就不可能知道在哪里花费了多少时间。
https://stackoverflow.com/questions/17232219
复制相似问题