こんにちは、truestarのk.takahashiです。
本記事ではSnowflakeの特徴的な機能の一つであるゼロコピークローンについて紹介いたします。
ゼロコピークローンとは
ゼロコピークローンとは、Snowflake内のデータベース、スキーマ、テーブルをコピーする機能になります。
非常にシンプルそうに思える機能ですが、Snowflakeが従来のコピーと何が違うのか見ていきましょう。
ゼロコピークローンの利点
一般的なデータベースコピーにかかる時間、コスト
バックアップや開発テスト・検証のために本番データベース等をコピーしたい場合は、一般的に以下のような時間、コストの制約がかかります。
- テスト環境構築や物理データの移し替えの手間
- データ量が2倍になったことに伴う、追加のストレージコスト
- (場合によっては)これらに伴うコミュニケーションコスト、追加予算承認など
そのため、「同じデータをコピーして利用する」という一見単純そうに思える作業もエンジニアのリソース、金額的なコストが発生してしまいます。
ゼロコピークローンのメリット
一方でゼロコピークローンは従来のコピーに比べると以下のようなメリットがあります。
- テスト環境を構築する手間がかからない
- 物理データを複製しないので追加のストレージコストが2倍にならない
- 作成されたコピーは独立しているので、互いに変更の影響を受けない
他にも様々なメリットがあるのですが、要約するとゼロコピークローンの活用をすることで、本番データベースと同じデータを活用するコスト、時間的な制約が少なくなると言えます。
ゼロコピークローンの仕組みを簡易的に解説
ゼロコピークローンはどのような仕組みでメリットを生み出しているのでしょうか?ざっくり図解いたします。
簡単な例として、既に存在するTABLE_Aのクローンを作成します。
CREATE TABLE TABLE_A CLONE TABLE_A_CLONE
上記のコマンドを実行すると、TABLE_A_CLONEがメタデータの階層に作成されTABLE_Aと同じストレージのデータを使用します。このようにTABLE_Aのストレージ層にあるデータを参照する新たなメタデータセット(TABLE_A_CLONE)を用意するだけで、データストレージはそのまま利用できるという仕組みがゼロコピークローンのメリットを生み出しているというわけです。
また、TABLE_A_CLONEに変更が発生してもTABLE_A_CLONEのストレージ参照先が変更されるだけなので元のTABLE_Aは影響を受けません。
※裏にはマイクロパーティションという技術が絡んでいるのですが、この仕組み単体で解説記事が必要そうなので後日改めて記載いたします。
クローニング可能なオブジェクト
公式ドキュメントを参照するとデータベース、スキーマ、テーブル以外にも、ストリーム、ステージ、シーケンスなどがクローニング可能だそうです(一部制約あり)。Snowflakeはアップデートのスピードが速いので、気になる方は以下公式ドキュメントを参照ください。
クローニングに関する考慮事項 | Snowflake Documentation
実際にクローニングをやってみた
概念だけでは、理解が捗らないので実践してみました。
クローン作製
図で示したようにTABLE_AとTABLE_ACLONEを作成します。
まずは、ZERO_CLONING_DB配下のPUBLICにTABLE_Aを作成
TABLE_Aには以下のようなデータが入っています。
あとは以下の簡単なクエリを書くだけで、テーブルのコピーができます。
CREATE TABLE {クローン後のテーブル} CLONE {元のテーブル};
たったこれだけで、とても簡単にクローンをつくることができました。しかも150ms(select実行分も含む)と早いのもポイントが高いです。
(もっと大きいデータなら、どのくらいかかるかテストしてみたいですね)
コピーの独立性を確認
次にTABLE_A_CLONEを更新しても、TABLE_Aの中身に影響がないか確認していきます。
TABLE_A_CLONEに橋本さんを追加しました。
次にTABLE_Aをの中身をselect文で見てみましょう。
以下の画像からTABLE_A_CLONEが更新されても、TABLE_Aは変更されないことがわかります。
TABLE_A_CLONEをテストテーブルを操作しても本番テーブルへは影響しません。
ここらへんもゼロコピークローンの使い勝手の良さが表れていますね。
おわりに
今回は、ゼロコピークローンについてご紹介しました。
時間、コストを気にせずデータを気軽にコピーできるのは画期的ですね。
みなさんもぜひ試してみてください。
これまでのSnowflakeに関する記事はこちら
(参考文献)
A Quick Look at Zero-copy Cloning in Snowflake