本記事は個人開発環境(Snowflake等)での検証結果であり、特定の業務環境を示すものではありません。
目次
はじめに
普段業務で大量のデータを扱うことが多く、またデータを分析ツールへ投入することもあり、その中で「これは自動化できそう」と感じる場面がありました。
そこで今回は学習も兼ねて実際に個人環境で検証を行い、自動化に成功したため自動化の実装方法を紹介したいと思います。
概要
通常、数ヶ月〜数年分のデータを遡って連携する際、対象のストアドプロシージャを呼び出すコマンドを"連携日数分"手動で叩くケースがあります。
(現場によっては異なる可能性があります。)
しかし、実行コマンドを手動で作成・実行するのは、工数がかかるだけでなく、実行漏れや重複投入といった操作ミスのリスクも孕んでいます。
(まあコマンド作成は最悪Excel関数で時短できますが...。)
加えて複数ストアドプロシージャがあり、まとめて実行・投入+実行Warehouse(以降WHで表記)の切替の場合だと余計にミスを誘発しやすいです。
そこで今回はループ処理を活用した自動で投入してくれる、WHも切り替えてくれるSQLの実装例を紹介したいと思います。
前提
- 対象ストアドプロシージャが合計5個
- 投入データの対象期間2025-01~2025-06の半年分
- ストアド1,3,4,5 実行WH:X-Small 実行時間:11秒
- ストアド2 実行WH:Medium 実行時間:3分
- ストアド1,2,3,4,5 投入期間:2025-01~2025-06まで
※コストについてはまた次回まとめます。
使用するループ操作(While文)
//WHILE ループは、条件がtrueの 間、反復
WHILE ( <condition> ) { DO | LOOP }
<statement>;
[ <statement>; ... ]
END { WHILE | LOOP } [ <label> ] ;
実装例(サンプルSQL)
//2025-01~2025-06までのループ処理
execute immediate $$
declare
start_date date default null;
end_date date default null;
begin
start_date := '2025-01-01'::date; --開始時期
end_date := '2025-06-30'::date; --終了時期
//while処理(end_dateまで1日ずつ追加して中の処理を繰り返し実行していく。)
while (start_date <= end_date) do
//Mediumに設定
execute immediate 'use warehouse Medium(※実際はWH名)';
//ストアド2
call "ストアド2"(:start_date);
//X-Smallで設定
execute immediate 'use warehouse X-Small(※実際はWH名)';
//ストアド1,3,4,5
call "ストアド1"(:start_date);
call "ストアド3"(:start_date);
call "ストアド4"(:start_date);
call "ストアド5"(:start_date);
//1日追加
start_date := dateadd('day',1,start_date);
end while;
return '分析データ投入完了';
end;
$$
;
上記のサンプルSQLのようにWhile文を活用することで終了時期まで繰り返し1日日数を追加して処理をしていくことで、手動で「コマンド実行→投入」をしなくても自動で「コマンド実行→投入」をすることができます。
ただ注意点としては、投入する期間が長ければ長いほど実行時間も長くなるので、実行前に設定されているタイムアウトを確認する必要があります。
また一度に全ての期間を投入しなくても、1ヶ月ごととか1週間ごととか状況に応じて変えて実行することも可能です。
まとめ
今回は「複数のストアドプロシージャを実行しデータを投入する必要があり、その際に一部実行時間が長くコスト最適化のため実行WHを切り替える必要がある」場合の自動化について紹介しました。
まだ実務での活用はできておらず、またテスト段階なので、エラーが発生した際の例外処理も今後実装していけれたらなと思います。