0

オラクルのグループバイ句に疑問がありました。グループ化は CPU を集中的に使用する操作ですか?

3,200 万行あり、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

いつものように、Explain Plan は興味深いものです。また、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 を実行する前に、データベースはまずこれらの列のすべての値を取得してから、適切に並べ替える必要があります。要求してから挿入します。さらに、クエリは一般的に見栄えが悪いです。group by を実行するときに値を失う可能性があるだけで、各列で集計合計を実行するのはなぜですか? たとえば、列 1 ~ 8 に重複した値がある場合、合計は *理由もなく複数回計算される可能性があります。

説明文を提供していないので、簡単な答えは、これほど多くのデータが選択されているため、集計は「確かにかなりの時間がかかる」ということです。グループ化はデータに依存しています。3,200 万レコードのテーブルから結果を取得するために必要な行数に基づいて、Oracle がこれほど多くの CPU を使用していなかったとしたら、私は驚くでしょう。

実行計画を見なければ、どこでどのくらいの時間が費やされているかを知ることはできません。

于 2013-06-21T10:07:48.803 に答える