🙄

【Snowflake】Hybrid Table を使ってみよう!

2024/10/25に公開

はじめに

こんにちは!システムサポートの斎藤です。

みなさんは、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 の仕様の詳細については、以下の公式ドキュメントもご参照ください。
https://docs.snowflake.com/en/user-guide/tables-hybrid

Hybrid Table とは

Snowflake で作成・利用できる OLTP(オンライントランザクション処理)向けのテーブルです。
通常の Snowflake テーブルは、OLAP(オンライン分析処理)向けです。大規模なデータ分析処理には適していますが、よりリアルタイム性の高い少数データへのトランザクション処理を行いたいケースもあるかと思います。
Hybrid Table はそうしたニーズに応えることができるオブジェクトタイプであり、さらに従来の OLAP 向けの Snowflake のテーブルや機能と組み合わせてワークロードを統合することも可能です。
(Snowflake では、こうした仕組みを Unistore と呼んでいます)

OLTP 向けテーブルと OLAP 向けテーブルは、利点や活用場面が異なるため、どちらが優れているというものではありません。
利用する場面やデータ特性にあわせて使い分けるのが最適な運用と言えます。
違いはおおよそ以下のとおりです。

OLTP OLAP
目的 データ処理 データ分析
一度に扱うデータ量 小さい 大きい
レスポンス 速い (相対的に)遅い
主な操作 読み取り+書き込み 読み取り
利用例 オンライン決済、等 集計、需要予測分析、等

OLAP と OLTP の詳細については、以下の Snowflake Webページもご参照ください。
https://www.snowflake.com/ja/guides/olap-vs-oltp/

Hybrid Table における追加機能、および制限事項は以下のとおりです。

追加機能
・ロックは行レベルで適用
・主キー制約、外部キー制約、ユニーク(一意)制約を強制可能
・パフォーマンスのためにインデックスをサポート(書き込み時に同期的に更新)
制限事項
商用 AWS リージョンのみ使用可能(東京・大阪リージョンは使用可)
・Azure または Google Cloud Platform(GCP)では使用不可
・試用アカウントでは使用不可
・データサイズは Snowflake データベースごとに1TB まで
・クラスタリングキー使用不可(代わりに主キーを使用)
・動的テーブル、マテリアライズドビュー使用不可
・Snowpipe、ストリーム 使用不可
・TimeTravel はサポートされるが一部制限あり
・複製(CLONE) 不可、UNDROP 不可
⇒ [追記] 2024/10/30 の GA(一般提供) に伴う変更により修正しました

制限事項の詳細については、以下の Snowflake 公式ページもご参照ください。
https://docs.snowflake.com/en/user-guide/tables-hybrid-limitations#limitations

Hybrid Table を使ってみよう!

それでは、実際に Hybrid Table を使って動作を確認してみましょう!
本記事では、Hybrid Table の作成と、前述の Hybrid Table の機能のうちの以下が実際に有効になっていることを確認します。
・ロックは行レベルで適用
・主キー制約、外部キー制約、ユニーク(一意)制約を強制可能

なお、本記事における設定内容は、以下の Snowflake 公式チュートリアルの内容の一部を基に改変して実施しています。
https://docs.snowflake.com/en/user-guide/tutorials/getting-started-with-hybrid-tables-tutorial#introduction

注意
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」の主キー・外部キー・ユニークキー制約に違反するデータを登録してエラーが表示されるかを確認します。
以下の手順で実行してください。

  1. 外部キーの登録
-- 外部キー制約確認用Insert
INSERT INTO TEST_FKEY_MASTER
(city_code) VALUES ('Shinjuku');
  1. データの登録(正常)
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');

主キー違反のエラーメッセージが表示されます。

  1. データの登録(異常:外部キー違反)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (3,104,'Ikebukuro');

外部キー違反のエラーメッセージが表示されます。

  1. データの登録(異常:ユニークキー違反)
INSERT INTO TEST_HYBRID
(truck_id,menu_type_id,city_code) VALUES (4,101,'Shinjuku');

ユニークキー違反のエラーメッセージが表示されます。

行レベルロックの適用確認

最後に、ロックが行レベルに適用されることを確認しましょう。
現在使用している SQL ワークシートで、メインテーブルの対象レコード行にトランザクションを COMMIT せずに UPDATE します。
その後、2つ目の SQL ワークシートを開いて同じテーブルに UPDATE を実行した際に、まだ COMMIT していないレコード行のみロックされていることを確認します。
以下の手順で実行してください。

  1. 最初のSQLワークシートで、メインテーブルの対象レコード行を UPDATE
    ※BEGINコマンド実行後、COMMITしない
BEGIN;
UPDATE TEST_HYBRID
  SET menu_type_id = 901
  WHERE truck_id = 1;

  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されます。

  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 = 903
  WHERE truck_id = 1;
COMMIT;

対象の(COMMITしていない)レコード行を UPDATE しようとしたため、レコード行がロックされている旨のメッセージ「ブロック済み」とともに、処理待ち状態になります。
「キャンセル」を押下して、処理を中断しましょう。

  1. 最初のSQLワークシートでに戻り、メインテーブルの対象レコード行を COMMIT
COMMIT;

  1. メインテーブルの内容を確認
SELECT * FROM TEST_HYBRID;

1.および 2.のUPDATEが適用されており、3.のUPDATEは適用されていないことが確認できます。

まとめ

本記事では、以下について学習しました。

  • Hybrid Table の特徴
  • Hybrid Table の作成方法
  • Hybrid Table における制約の適用確認(主キー・外部キー・ユニーク)
  • Hybrid Table の行レベルロックの適用確認

Hybrid Table を使用することで、Snowflake 上でデータをより効率的かつ運用形態に即した形で管理・利用することが可能です。
皆さんもぜひ活用してみてください!

https://www.sts-inc.co.jp/snowflake/

Discussion