【Snowflake】Hybrid Table を使ってみよう!
はじめに
こんにちは!システムサポートの斎藤です。
みなさんは、Snowflake の Hybrid Table 機能についてご存知でしょうか?
Snowflake のテーブルは通常 OLAP 向けのテーブルですが、Hybrid Tableとして作成することで、OLTP 向けのテーブルも使用することが可能です。
今回は、Hybrid Table を作成し、機能の動作確認する方法を紹介します!
注意
本記事執筆時点(2024年10月)では、Hybrid Table はパブリックプレビュー機能であり、
・商用AWSリージョンのみ使用可能(東京・大阪リージョンは使用可)
・AzureまたはGoogle Cloud Platform(GCP)では使用不可
・試用アカウントでは使用不可
などの制限があります。
⇒ [追記] 2024/10/30 に Hybrid Table 機能が GA(一般提供) されました!
上記のうちリージョン制限は緩和されましたが、その他の制限は継続しています。
その他制限については、本記事の「制限事項」をご参照ください。
本記事でわかること
本記事では、Snowflake で OLTP ワークロードを実現できる Hybrid Table(ハイブリッドテーブル)の使用方法を解説します。
具体的には以下の内容について理解することができます。
- Hybrid Table の特徴
- Hybrid Table の作成方法
- Hybrid Table における制約の適用確認(主キー・外部キー・ユニーク)
- Hybrid Table の行レベルロックの適用確認
※Hybrid Table の仕様の詳細については、以下の公式ドキュメントもご参照ください。
Hybrid Table とは
Snowflake で作成・利用できる OLTP(オンライントランザクション処理)向けのテーブルです。
通常の Snowflake テーブルは、OLAP(オンライン分析処理)向けです。大規模なデータ分析処理には適していますが、よりリアルタイム性の高い少数データへのトランザクション処理を行いたいケースもあるかと思います。
Hybrid Table はそうしたニーズに応えることができるオブジェクトタイプであり、さらに従来の OLAP 向けの Snowflake のテーブルや機能と組み合わせてワークロードを統合することも可能です。
(Snowflake では、こうした仕組みを Unistore と呼んでいます)
OLTP 向けテーブルと OLAP 向けテーブルは、利点や活用場面が異なるため、どちらが優れているというものではありません。
利用する場面やデータ特性にあわせて使い分けるのが最適な運用と言えます。
違いはおおよそ以下のとおりです。
OLTP | OLAP | |
---|---|---|
目的 | データ処理 | データ分析 |
一度に扱うデータ量 | 小さい | 大きい |
レスポンス | 速い | (相対的に)遅い |
主な操作 | 読み取り+書き込み | 読み取り |
利用例 | オンライン決済、等 | 集計、需要予測分析、等 |
OLAP と OLTP の詳細については、以下の Snowflake Webページもご参照ください。
Hybrid Table における追加機能、および制限事項は以下のとおりです。
追加機能
・ロックは行レベルで適用
・主キー制約、外部キー制約、ユニーク(一意)制約を強制可能
・パフォーマンスのためにインデックスをサポート(書き込み時に同期的に更新)
制限事項
・商用 AWS リージョンのみ使用可能(東京・大阪リージョンは使用可)
・Azure または Google Cloud Platform(GCP)では使用不可
・試用アカウントでは使用不可
・データサイズは Snowflake データベースごとに1TB まで
・クラスタリングキー使用不可(代わりに主キーを使用)
・動的テーブル、マテリアライズドビュー使用不可
・Snowpipe、ストリーム 使用不可
・TimeTravel はサポートされるが一部制限あり
・複製(CLONE) 不可、UNDROP 不可
⇒ [追記] 2024/10/30 の GA(一般提供) に伴う変更により修正しました
制限事項の詳細については、以下の Snowflake 公式ページもご参照ください。
Hybrid Table を使ってみよう!
それでは、実際に Hybrid Table を使って動作を確認してみましょう!
本記事では、Hybrid Table の作成と、前述の Hybrid Table の機能のうちの以下が実際に有効になっていることを確認します。
・ロックは行レベルで適用
・主キー制約、外部キー制約、ユニーク(一意)制約を強制可能
なお、本記事における設定内容は、以下の Snowflake 公式チュートリアルの内容の一部を基に改変して実施しています。
注意
Hybrid Table の事前準備において、以下が必要ですので事前にご確認ください。
- ご利用のユーザーが、ACCOUNTADMIN ロールを使用可能であること
事前準備
使用するロール・DB・スキーマ・ウェアハウスを作成します。
作成したロールを現在のユーザーに割り当て、DB・スキーマ・ウェアハウスの所有者権限を付与します。
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE ROLE hybrid_quickstart_role;
SET my_user = CURRENT_USER();
GRANT ROLE hybrid_quickstart_role TO USER IDENTIFIER($my_user);
CREATE OR REPLACE WAREHOUSE hybrid_quickstart_wh WAREHOUSE_SIZE = XSMALL, AUTO_SUSPEND = 300, AUTO_RESUME = TRUE;
GRANT OWNERSHIP ON WAREHOUSE hybrid_quickstart_wh TO ROLE hybrid_quickstart_role;
CREATE OR REPLACE DATABASE hybrid_quickstart_db;
GRANT OWNERSHIP ON DATABASE hybrid_quickstart_db TO ROLE hybrid_quickstart_role;
USE ROLE hybrid_quickstart_role;
CREATE OR REPLACE SCHEMA data;
USE WAREHOUSE hybrid_quickstart_wh;
Hybid Table の作成
Hybrid Table を作成します。
今回はメインで使用するテーブルと、外部キー制約確認に使用するテーブルの2種類を作成します。
外部キー制約確認用テーブルは主キー制約、メインテーブルは主キー・外部キー・ユニークキー制約を付与します。
以下の手順で実行してください。
-- Hybrid table 作成(外部キー制約確認用)
CREATE OR REPLACE HYBRID TABLE TEST_FKEY_MASTER (
city_code VARCHAR(16777216),
PRIMARY KEY (city_code)
);
-- Hybrid table 作成(メインテーブル)
CREATE OR REPLACE HYBRID TABLE TEST_HYBRID (
truck_id NUMBER(38,0) NOT NULL,
menu_type_id NUMBER(38,0) NOT NULL UNIQUE,
city_code VARCHAR(16777216),
PRIMARY KEY (truck_id),
FOREIGN KEY (city_code) REFERENCES TEST_FKEY_MASTER(city_code)
);
作成した Hybrid Table の設定を確認します。
従来の「SHOW TABLES」コマンドや、「DESCRIBE」コマンドでも確認できる他、
「SHOW HYBRID TABLES」コマンドで Hybrid Table のみ表示することも可能です。
-- テーブル一覧表示
SHOW TABLES LIKE '%TEST_HYBRID%';
-- Hybrid テーブル一覧表示
SHOW HYBRID TABLES LIKE '%TEST_HYBRID%';
-- Hybrid テーブル定義内容確認
DESCRIBE TABLE TEST_HYBRID;
制約の適用確認(主キー・外部キー・ユニーク)
次に、作成した Hybrid Table に付与した制約が適用(強制)されているかを確認してみましょう。
外部キー制約確認用「TEST_FKEY_MASTER」に外部キーとなる値を登録した後、メインテーブル「TEST_HYBRID」の主キー・外部キー・ユニークキー制約に違反するデータを登録してエラーが表示されるかを確認します。
以下の手順で実行してください。
- 外部キーの登録
-- 外部キー制約確認用Insert
INSERT INTO TEST_FKEY_MASTER
(city_code) VALUES ('Shinjuku');
- データの登録(正常)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (1,101,'Shinjuku');
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (2,102,'Shinjuku');
3. データの登録(異常:主キー違反)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (1,103,'Shinjuku');
主キー違反のエラーメッセージが表示されます。
- データの登録(異常:外部キー違反)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (3,104,'Ikebukuro');
外部キー違反のエラーメッセージが表示されます。
- データの登録(異常:ユニークキー違反)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (4,101,'Shinjuku');
ユニークキー違反のエラーメッセージが表示されます。
行レベルロックの適用確認
最後に、ロックが行レベルに適用されることを確認しましょう。
現在使用している SQL ワークシートで、メインテーブルの対象レコード行にトランザクションを COMMIT せずに UPDATE します。
その後、2つ目の SQL ワークシートを開いて同じテーブルに UPDATE を実行した際に、まだ COMMIT していないレコード行のみロックされていることを確認します。
以下の手順で実行してください。
- 最初のSQLワークシートで、メインテーブルの対象レコード行を UPDATE
※BEGINコマンド実行後、COMMITしない
BEGIN;
UPDATE TEST_HYBRID
SET menu_type_id = 901
WHERE truck_id = 1;
- 2つ目のSQLワークシートを開き、メインテーブルのデータを UPDATE(成功)
USE ROLE hybrid_quickstart_role;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;
USE WAREHOUSE hybrid_quickstart_wh;
BEGIN;
UPDATE TEST_HYBRID
SET menu_type_id = 902
WHERE truck_id = 2;
COMMIT;
対象の(COMMITしていない)レコード行以外を UPDATE したため、正常にCOMMITされます。
- 2つ目のSQLワークシートにて、メインテーブルのデータを UPDATE(失敗)
USE ROLE hybrid_quickstart_role;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;
USE WAREHOUSE hybrid_quickstart_wh;
BEGIN;
UPDATE TEST_HYBRID
SET menu_type_id = 903
WHERE truck_id = 1;
COMMIT;
対象の(COMMITしていない)レコード行を UPDATE しようとしたため、レコード行がロックされている旨のメッセージ「ブロック済み」とともに、処理待ち状態になります。
「キャンセル」を押下して、処理を中断しましょう。
- 最初のSQLワークシートでに戻り、メインテーブルの対象レコード行を COMMIT
COMMIT;
- メインテーブルの内容を確認
SELECT * FROM TEST_HYBRID;
1.および 2.のUPDATEが適用されており、3.のUPDATEは適用されていないことが確認できます。
まとめ
本記事では、以下について学習しました。
- Hybrid Table の特徴
- Hybrid Table の作成方法
- Hybrid Table における制約の適用確認(主キー・外部キー・ユニーク)
- Hybrid Table の行レベルロックの適用確認
Hybrid Table を使用することで、Snowflake 上でデータをより効率的かつ運用形態に即した形で管理・利用することが可能です。
皆さんもぜひ活用してみてください!
Discussion