【Oracle】【Snowflake】Oracle Autonomouse DatabaseとSnowflakeをデータベースリンクで繋いでみた

Oracle Autonomous Database on Shared Exadata Infrastructureで2022年3月にリリースされた新機能Database Links with Oracle-Managed Heterogeneous Connectivityがあります。

その機能概要は”Autonomous Database support for Oracle-managed heterogeneous connectivity makes it easy to create database links to non-Oracle databases. When you use database links with Oracle-managed heterogeneous connectivity, Autonomous Database configures and sets up the connection to the non-Oracle database.”とございまして、端的に言えばAutonomous Databaseから非Oracle Databaseに対してDBリンクが使用可能になったとのことです。
なお、ここで言う非Oracle DatabaseはSnowflake、Amazon Redshift、PostgreSQL、MySQLとなっています。
詳細は公式ドキュメントをご確認ください。
[Database Links with Oracle-Managed Heterogeneous Connectivity](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)

Oracle Database、Snowflakeなど多種類のデータベースを利用する私にとっては非常に都合の良い機能なので早速触ってみました。

### Autonomous Data WarehouseからSnowflakeにDBリンクを作成する

構成手順は非常に簡単です。
まずDBMS_CLOUD.CREATE_CREDENTIALプロシージャでSnowflakeへ接続するためのクレデンシャルを作成します。

【例】Snowflake on Azureへ接続するクレデンシャルを作成
```SQL
BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
          credential_name => 'AZURE_SNOWFLAKE_LINK_CRED',
          username => 'mogutan',
          password => 'Pass#123'
          );
END;
/
```

次にDBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKプロシージャでSnowflakeへのDBリンクを作成します。

【例】Snowflakeアカウントx68k030.japan-east.azure、snowflake_sample_dataデータベースにDBリンクを作成
```SQL
 BEGIN
      DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
           db_link_name => 'AZURE_SNOWFLAKE_LINK',
           hostname => 'x68k030.japan-east.azure',
           port => '443',
           service_name => 'snowflake_sample_data',
           credential_name => 'AZURE_SNOWFLAKE_LINK_CRED',
           gateway_params => JSON_OBJECT('db_type'  value 'SNOWFLAKE'),
           directory_name => NULL,
           ssl_server_cert_dn => NULL);
 END;
 /
```

DBリンクの構成は以上です。

### Autonomouse Data WarehouseからSnowflakeのテーブルにクエリを実行してみる

作成したDBリンクを使ってAutonomous Data WarehouseからSnowflakeへクエリを実行してみましょう。
従来のOracle Database --> Oracle DatabaseのDBリンクの使い方と変わりありませんが、SQL*Plusを使ってSnowflakeのオブジェクトを触りにいく操作はちょっと面白いですね。

```SQL
SQL> select count(*) from tpch_sf1.customer@azure_snowflake_link;

  COUNT(*)
----------
    150000
```
ちなみにSnowflake側ではちゃんとMETADATA-BASED RESULTで返してきます。

### Oracle DatabaseとSnowflakeのテーブルが混在するマテリアラズドビューを作ってみよう

DBリンクとマテリアラズドビューの組み合わせはよく使われると思います。
Snowflakeでは複数テーブルを結合したマテリアラズドビューがまだサポートていないのですが、マテリアラズドビュー機能が充実しているAutonomouse Data Warehouse＝Oracle Databaseと繋がったのであれば、Oracle DatabaseとSnowflakeのテーブルを結合したマテリアラズドビューが出来るじゃないと言うことで早速作ってみようと思います。

customerテーブルとordersテーブルはSnowflake、adw_nationテーブルはAutonomouse Data Warehouseのローカルにあるテーブルを結合してサマリした結果を持つマテリアラズドビューを作ってみます。
```SQL
SQL> create  materialized view mv_sum_orders refresh start with sysdate next sysdate + 1/48 as
  2  select n.n_name as nation_name,c.c_name as customer_name,sum(o.o_totalprice) as totalprice  from tpch_sf1.orders@azure_snowflake_link o
  3  inner join tpch_sf1.customer@azure_snowflake_link c
  4  on c.c_custkey=o.o_custkey
  5  inner join adw_nation n
  6  on c.c_nationkey = n.n_nationkey
  7  group by n.n_name,c.c_name;

マテリアライズド・ビューが作成されました。
```
あっさりと作成できてしまいます。当たり前ですがクエリも普通に実行できます。
```SQL
SQL> select * from mv_sum_orders order by nation_name fetch first 10 rows only;

NATION_NAME                                        CUSTOMER_NAME                                      TOTALPRICE
-------------------------------------------------- -------------------------------------------------- ----------
ALGERIA                                            Customer#000000086                                 2664809.56
ALGERIA                                            Customer#000011758                                 2438281.75
ALGERIA                                            Customer#000009365                                  1175726.6
ALGERIA                                            Customer#000006533                                  887484.64
ALGERIA                                            Customer#000005465                                  811363.43
ALGERIA                                            Customer#000005396                                 1685726.02
ALGERIA                                            Customer#000003763                                 2902598.01
ALGERIA                                            Customer#000002557                                 3824165.42
ALGERIA                                            Customer#000001933                                 3113696.86
ALGERIA                                            Customer#000001504                                 4423500.93

10行が選択されました。
```


Snowflakeにマテリアラズドビューログを作れないので高速リフレッシュは難しいですが、実用性はあるのではないでしょうか。
データであれば何でも食ってしまうデータウェアハウスとしてSnowflakeを使い、データマートでAutonomous Data Warehouseを使うなんて贅沢な使い方が出来たりするかもしれませんね。
なんと言ってもAutonomous Data Warehouseも裏はあのOracle Exadataなわけですからパフォーマンスは申し分ないはずです。

### 感想
今回はSnowflakeだけでしたが、Amazon RedshiftやMySQL、PostgreSQLともDBリンクが作成できるので、その気になれば簡単に多種データソースのテーブルを結合したテーブルやマテリアラズドビューが作れてしまうと思います。
Database Links with Oracle-Managed Heterogeneous Connectivityはとても便利な機能だと思いますので皆さんも一度お試しください。
私はOracle Cloudの無償枠を利用してすぐに試せました。

###