テーブルデータを入れ替えたい!
Athena参照するデータはS3にあって柔軟にデータを入れ替えることが可能です。
不要になったデータは削除したり、新たに必要なデータを追加したりということが簡単に行なえます。2019年よりINSERT INTOも対応されたので、さらにデータの追加も簡単になりました。
データの入れ替え時に正しくない状態のデータが一時的に存在してしまう
例えば日付ごとのデータを管理していて、2022年4月1日のデータを削除して、新たにデータを入れるとします。
そうすると一時的に2022年4月1日のデータが空になってしまうことになります。この瞬間に他のユーザーがこのテーブルにアクセスすると、正しくないデータを取得してしまう可能性があります。
viewテーブルを活用
今回はhoge
テーブルを利用していたとします。この中身をダウンタイム無しで入れ替えるにはhogeテーブルをviewテーブルとして起きます。viewの参照先はhoge_1
とでもしておきます。hoge_view_1
にはこれまでhoge
テーブルが見ていたデータを入れておきます
CREATE OR REPLACE VIEW hoge AS
SELECT * FROM hoge_1
こうしておけばhogeテーブルはこれまで通り
SELECT * FROM hoge
のようにデータを取得できます。このhogeテーブルの中身を入れ替えたいとなったら先にデータを修正したhoge_2
を作っておきます。
それを再度viewで作り変えます
CREATE OR REPLACE VIEW hoge AS
SELECT * FROM hoge_2
こうすることで常にhogeテーブルは参照できつつ、データの入れ替えが可能になりました。一時的にS3に存在するデータは倍になるのであまりにもデータが巨大だと難しいかもしれません。
スキャン量の心配はなし(要検証)
Athenaはviewやサブクエリを利用しても最終的に必要になる分だけのデータしかスキャンしないようになっているようです
SELECT * FROM hoge limit 100
として場合、hogeテーブルはviewなのでhoge_1を全件スキャンしたあとに100件だけ取得するような動きに見えるかもしれませんが、実際にはhoge_1から100件のみスキャンしてくれるみたいで、不要なスキャンが増える心配もなさそうです。
ただ様々なパターンで検証はしていないので、特定の場合にはviewを利用したことによりスキャンが増えるかもしれないのでそのへんはご検証ください