ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

SQL to AsakusaFW:join(GroupView)

2019-12-14 08:46:03 | PG(分散処理)

Asakusa Framework Advent Calendar 2019の14日目、SQLをAsakusaFWに変換するポイントについてです。

SELECT文のFROM句におけるテーブル結合はCoGroupMasterJoinUpdate演算子で実現できるのですが、キーのデータが偏っている場合は問題になることがあります。

例えばエラーコードをキーにエラーメッセージテーブルからメッセージを取得(結合)する(エラーコードの種類は少ない)場合です。
処理は結合キーの種類の数だけ分散して行われるので、種類の数が少ないと、データがそれぞれに集中してしまい、あまり分散しません。集中した件数によっては、CoGroup演算子の引数にListを使っているとメモリーが足りなくてOutOfMemoryErrorになることがあります。(引数をIterableにすれば回避できますが、処理内容によっては常にIterableに出来るとも限らないので)

特に、上記の例でエラーメッセージテーブルとの結合がLEFT JOIN(エラーコードがnullの場合は取得しない)とすると、ほとんどがnullのデータであれば、CoGroup演算子に渡るnullデータの所にデータが集中してOutOfMemoryErrorになりえます。(こういう事はよくありますorz)

こういった場合、Extract演算子(出力件数が常に1件ならUpdate演算子)とGroupViewを使う方法も考えられます。
ExtractやUpdate演算子は結合キーに依らず適当に分散されるので、エラーメッセージテーブルをGroupViewとし、エラーコードを元にメッセージを取得すればいいのです。
ただしこの方法は、上記の例の様にGroupViewのレコード件数が比較的少ない場合しか使用できません。(本来の分散処理では、必要なデータ毎に分散するのでそれぞれのデータは少なくなる想定ですが、GroupViewはそこに渡されるデータを全てメモリー上に乗せるので、これが多いとメモリーが足りなくなってしまう為)


コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« SQL to AsakusaFW:join(Mas... | トップ | SQL to AsakusaFW:join(nul... »
最新の画像もっと見る

コメントを投稿

PG(分散処理)」カテゴリの最新記事