MENU
Dr.Sum ConnectからDr.Sumへデータを書き込む方法として、全部で4つコンポーネントが用意されています。
実際に使う際はどれを使えばよいのか?と迷ってしまうこともあります。本記事では、各コンポーネントの特性について触れつつ、シーン別の使いどころと運用時のテクニックをまとめて紹介します!
TRUNCATE-INSERTはテーブルの中身を一度空にして、INSERTする方法です。
マスタテーブルに対して利用されることが多く、処理プロセスもシンプルです。INSERTする件数が比較的小規模な場合で有効であり、他の方法と違って定期的な再構築(リビルド)が不要です。
TRUNCATE-INSERTの使い分けは、基本的にVTBを使用するか否かで判断してOKです。
VTBを使う場合は「書き込み(VTB)」の中に「テーブル内の行を削除してインポート」の選択肢があるのでそちらを利用しましょう。
VTBを使わない場合は、「Truncate」コンポーネントと「書き込み(BulkInsert)」を直列につないで実行します。
DELETE-INSERTはテーブルの中身を特定の条件(日付範囲で絞ることが多い)を満たす行を削除後、INSERTする方法です。
主にトランザクションテーブルで利用されます。上記例のように、日々蓄積するデータのうち「今月」や「直近7日間」といった範囲でデータを更新することができます。
DELETEする範囲は日々蓄積するデータ量や更新頻度によって検討しましょう。
極端な例ですが例えば日付の範囲を「1日」にした場合、データ量は少ないので処理自体は早く終了します。
しかし、システムメンテナンスなどで数日抜けが生じてしまうと、人が手動で抜けた分をリカバリする必要があります。
「直近7日間」程度に幅を持たせておくと、理論上6日間は抜けが発生しても次の日のバッチ実行でリカバリできます。
このあたりのノウハウについては、下記で紹介されているのでぜひご一読ください。
ウイングアーク1stの事例:Dr.Sum Connectの対策事例 |
コンポーネントの使い分けに関しては、TRUNCATE-INSERTと同様VTBを使用するか否かでOKです。
「SQL実行(更新系)」の中身は下記を参考にするとよいです。
DELETE FROM ${table_name}
WHERE ${table_name}.日付 BETWEEN '${start_date}' and '${end_date}';
変数 ${start_date}および${end_date}には削除する範囲となる日付をmappingコンポーネントを用いて事前に代入します。これにより、「今月」や「直近7日間」といった範囲を動的にDELETEすることができます。
注意点として定期的な再構築(リビルド)が必要です。詳細は下記をご覧ください。
UPSERTはキーとなる項目を参照して、キーが存在すればその行を更新、なければ追加します。
件数の多い大規模なマスタテーブルに利用されることが多く、特に日中更新するなどリアルタイム性が要求される場合に有効です。
TRUNCATE-INSERTやDELETE-INSERTとは違い、テーブルが空の状態もしくは一部削除された状態で参照されない点が魅力です。
使い分けとして、DataLoaderライセンスを利用する場合とConnect側の機能で処理する方法があります。
Connect機能である「書き込み(更新/挿入)」コンポーネントは標準で利用可能ですが、DataLoaderを使った場合と比較して速度面でかなり劣ります。詳細は本記事後半の「書き込み(更新/挿入)」について掘り下げた記事を参照ください。
ちなみに筆者の環境で比較したところ、3列の空のテーブルに対して30,000件のデータ挿入を行った場合、「書き込み(DataLoader)」では1.6秒、「書き込み(更新/挿入)」の「キーの値と一致する行は更新」で3分16秒かかりました。UPSERTは特にリアルタイム性が重要視されるシーンが多いのでこの点は注意が必要です。
また、DELETE-INSERTと同様定期的な再構築(リビルド)は忘れないようにしましょう。
Connectを使ってDr.Sumにデータを連携する際には、CSVだけではなくネットワークを経由したデータベース(Oracle、SQL Serverなど)や、クラウドサービス(Salesforce、RedshiftやSnowflakeなどのクラウドDB)と接続することが多いです。
TRUNCATE-INSERTやDELETE-INSERTでは、データ挿入の前にテーブルを空にしたり特定範囲のデータを消す工程があります。
その際、インポート中にエラーが発生してしまい、削除処理のみ行われてしまう事象は絶対にケアすべき重要な問題です。
実際、リモートのサービス側に問題が発生していたり、ネットワークが一時的に切れてしまったりすることでインポートがエラーになってしまうことはよくあります。
前述の通り、ネットワークを介したデータ取得中には様々な要因でエラーになる可能性があります。
その場合、Dr.Sum上のデータを削除するタイミングは非常に重要です。
Amazon S3からファイルを読み出し、TRUNCATE-INSERTする場合を考えてみます。以下はNGのスクリプトの例です。
仮にこの状態でS3との接続が切れてエラーになった場合、本番テーブルへのTRUNCATEのみ実行された形になってしまいます。
ネットワークを介した処理を噛ませる場合、できるだけそのポイントでエラーが起きる前提でスクリプトを設計しましょう。
以下では、S3からのデータ取得が成功した場合のみTRUNCATE-INSERTが行われるようにした設計です。
ConnectのBulkInsertもしくはVTBを使用したインポートを行うと、実はこっそり一時的なワークテーブルが作られています(標準のインポートも同様)。
下記のように、「tableA」というテーブルにbulkInsertすると、データベースのフォルダの下にテーブル名と同じ名前の一時的なフォルダが作られていることが確認できます。
一時的なワークテーブルに書き出す仕組みによって、INSERT中であってもSELECTで参照することができます(INSERT後の確定処理は除く)。
TRUNCATE-INSERTやDELETE-INSERTでは事前にデータの削除処理が行われるため、INSERT処理が走っている間はテーブルが空であったり、一部削除されているなど意図したデータが参照できません。
夜間実行であればあまり問題ないですが、日中更新する場合は数分単位で時間がかかると不都合が生じる可能性もあります。
このようにINSERTにかかる時間が運用上問題ないのか、許容できるかぜひ検討しましょう。
以下、各書き込みコンポーネントについてログを追いかけながら、掘り下げた記事をまとめています。
本記事では、Connectのデータ挿入コンポーネントについて、使いどころやテクニックについてまとめました。
コンポーネント自体は4つありますが、それぞれの使いどころは明確なのでぜひ使いこなしてみてください!
Related article
Pick up
Ranking
Info