Data VirtualizationでSUM() または AVG() 関数がエラーを返す

最終更新: 2025年3月17日
Data VirtualizationでSUM() または AVG() 関数がエラーを返す

特定の SQL ステートメントで SUM () 関数または AVG () 関数を使用すると、SQL0802N エラーが発生する場合があります。

症状

SQL ステートメントで SUM() 関数または AVG() 関数を使用します。 特定の SQL ステートメントが以下のエラー・メッセージを出して失敗する場合があります。
SQL0802N Arithmetic overflow or other arithmetic exception occurred.

原因

結果タイプまたは中間タイプが処理データの量を処理するのに十分な大きさでない場合、SUM() 関数または AVG() 関数を実行時に算術オーバーフロー操作が発生する可能性があります。 例えば、整数列の SUM() の実行時に、合計データ量が整数の最大サイズを超える場合、算術オーバーフローが発生することがあります。

照会内で SUM() または AVG() が使用される位置によっては、関数が処理するデータが増える原因となるプラン変更が存在し、結果または中間結果が大きくなりすぎる場合に、エラーが発生する可能性があります。

問題の解決

この問題を解決するには、原因や、関数引数のデータ型に応じて、以下のいずれかの方式を選択します。

  • 関数で参照されている引数のデータ型を変更するか、CAST 指定を追加します。 例えば、引数のデータ型を INT から BIGINT (または DECIMAL) に変更することも、関数の引数を BIGINT (または DECIMAL) にキャストすることもできます。 引数のデータ型が DECIMAL の場合、オーバーフローを避けるためには、データの精度やスケールを調整するキャストが必要になる場合があります。
    注: CAST を追加すると、アクセス・プランまたは照会のパフォーマンスが変更される可能性があります。
  • DB2_DV_OVERRIDES レジストリー変数を変更して、すべての照会の早期集約を無効にします。 プラットフォーム管理者は、c-dv2u-cv-db2u-0 ポッドから以下のコマンドを実行する必要があります。
    db2set | grep DB2_DV_OVERRIDES; 
    db2set -im DB2_DV_OVERRIDES="Existing_values, NO_EAGGB";
    db2 flush package cache dynamic; 
  • 以下の例に示すように、最適化のヒントとして NO_EAGGB 設定を追加することで、この照会の初期段階での集計のみを無効にします。
    select .... 
             SUM() .... 
              /* <OPTGUIDELINES>
                      <REGISTRY>
                      <OPTION NAME='DB2_DV_OVERRIDES'   VALUE='Existing_values,NO_EAGGB'/>
                      </REGISTRY>
                 </OPTGUIDELINES> */
    
  • 詳しくは、以下のリソースを参照してください。