やりたいこと
DataSpiderというETLツールにDr.Sumアダプタ機能を追加することで、Dr.Sumへの書込みが可能になります。
Dr.Sumアダプタ機能には標準の書込み機能があり、「キーと一致する行は更新」する設定ができます。
一方、Dr.Sumへ書き込む際にDataLoaderというオプション機能を使うと、同様に「キーと一致する行は更新」することができます。
今回はこの2つの「キーと一致する行は更新」して書き込む方法(一般的にいうとUPSERT)の違いを調査してみようと思います。
結論
結論からいうと、2つの違いは以下です。
・書き込み(更新/挿入)アイコンの「キーの値と一致する行は更新」
書き込み先のテーブルにUPDATEを全行に対して行い、無ければINSERTしています。そのため、件数が多いとその分処理が遅くなります。
・書き込み(DataLoader)アイコン
インポート処理がSQLのレイヤではなくDr.Sum内部で完結しており、全件一括で処理しているため高速なインポートがを実現しています。
では、Dr.Sumのログを確認しながら各処理の中身を見ていきます。
UPSERTって?
データベース用語として良く使われる用語で、UPDATEとINSERTを組み合わせた造語らしいです。
テーブルへレコードの書き込みを行う際、キー項目を見て「キー項目があれば更新(UPDATE)、無ければ挿入(INSERT)」する操作を指します。
調査!
サンプルデータとして、次の4パターンで実験してみます。UPDATEする行数も固定しておきます。
・3列のテーブルに対し10件UPSERT(UPDATE:3件、INSERT:5件、変更なし:2件)
・3列のテーブルに対し50000件UPSERT(UPDATE:10000件、INSERT:10000件、変更なし:30000件)
・10列のテーブルに対し10件UPSERT(UPDATE:3件、INSERT:5件、変更なし:2件)
・10列のテーブルに対し50000件UPSERT(UPDATE:10000件、INSERT:10000件、変更なし:30000件)
ロジック
・書き込み(更新/挿入)アイコンの「キーの値と一致する行は更新」で書き込み
・DataLoaderで書き込み
実験方法
上記ロジックで、それぞれ4パターンの処理を実行し処理速度を調べてみます。
DataSpiderの実行履歴から、書き込みアイコンの処理にかかった時間を処理時間とします。
結果
結果は表のとおりです。
結果から50000行UPSERTとなると、標準のUPSERT機能だとかなり遅くなっていることがわかりますね。
これはなぜでしょうか。Dr.Sumのログを見つつどんな処理が流れているのか見てみます。
標準UPSERTはなぜ遅い?
10列10行のデータを標準UPSERTを行ったときのログがこちらです。
insertデータを除くと、書き換えたデータは5件中3件だけにも関わらず、update文は5件実行されています。
データが書き換わっているか否かにかかわらずテーブルの件数分SQLが実行されているため時間がかかってしまうようです。
DataLoaderはなぜ早い?
同様にSQLを見てみます。
このログを見ると、INSERTやUPDATEといったSQLは実行されていないようです。「IMPORT」ログも見てみます。
IMPORTログを見てみると、bulk insertで一括インサート処理が行われているようです。
SQLのレイヤではなく、インポート処理が内部で完結しているため高速な処理ができているようですね。
まとめ
今回は、DataSpiderのDr.SumアダプタのUPSERT機能について調査しました。
標準のUPSERT機能とDataLoaderを使ったUPSERTで処理速度を比較し、ログを頼りにどんな処理を行っているのか調査しました。
結果として、標準のUPSERT処理では全行に対してUPDATE・無ければINSERTを行っているのに対し、DataLoaderはそもそもSQLベースでの処理ではなくDr.Sum内部で一括処理を行っているため高速な処理を実現しているようです!すごい!