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
Oracle Database、Snowflakeなど多種類のデータベースを利用する私にとっては非常に都合の良い機能なので早速触ってみました。
Autonomous Data WarehouseからSnowflakeにDBリンクを作成する
構成手順は非常に簡単です。
まずDBMS_CLOUD.CREATE_CREDENTIALプロシージャでSnowflakeへ接続するためのクレデンシャルを作成します。
【例】Snowflake on Azureへ接続するクレデンシャルを作成
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リンクを作成
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> 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> 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> 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の無償枠を利用してすぐに試せました。