ラベル DB23c の投稿を表示しています。 すべての投稿を表示
ラベル DB23c の投稿を表示しています。 すべての投稿を表示

2024年3月4日月曜日

Oracle LiveLabsのExploring Operational Property Graphs in 23c Freeを手元の環境で実施する

Oracle LiveLabsにOracle Database 23cに実装されたSQL/PGQの演習が提供されています。

Operational Property Graphs Example with SQL/PGQ in 23c
https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3659

この演習のLab 1から4までは演習環境の準備で、実際の演習はLab 5から始まります。演習環境はOracle Cloudに構築することを前提としているため、準備のハードルは低くはありません。

先日、Oracle Database 23cとOracle REST Data Servicesのコンテナ・イメージを使って、Oracle Database 23c FreeでOracle APEXが動く環境を作りました(記事その1その2)。その環境を使ってProperty GraphのLiveLabsを実施してみました。その手順を紹介します。

LiveLabsの演習ではOracle SQL Developerを使用していますが、本記事ではOracle SQL Developer Extension for VS Codeを代わりに使用します。

コンテナ・イメージから作成したOracle APEXの環境では、以下のURLからORDSのランディング・ページにアクセスします。


コンテナ・イメージから作成したOracle APEXの環境で演習を実施するため、Lab 1から4の作業はすべてスキップします。

Lab 5は演習に使用するデータベース・スキーマの準備、Lab 6が実際にProperty Graphを操作するSQLの実行を行います。Oracle APEXのアプリケーションを使った演習は、Lab 6に続くBonus Labとして提供されています。

今回はBonus Labまでを行なうので、Lab 5、6で使用するスキーマをOracle APEXのワークスペースに紐づけて作成します。


ワークスペースを作成する



Oracle APEXの管理サービスにサインインし、新規にワークスペースを作成します。


管理ユーザー名とパスワードは、Oracle APEXのインストール時にスクリプト@apxchpwdを実行して決めた値になります。


作成済みのワークスペースが存在しない場合、サインイン後にワークスペースの作成を求められます。


ワークスペース名を指定します。今回の作業ではAPEXDEVとしました。

へ進みます。


スキーマは新規に作成するため、既存のスキーマの再利用いいえを選択します。

今回はスキーマ名はAPEXDEVとしました。このスキーマ名はOracle SQL Developer Extension for VS Code(長いので以降VS Codeとします)からデータベースに接続する際のユーザー名として指定します。Autonomous Database上にワークスペースを作成する場合は、スキーマ名はワークスペース名に接頭辞としてWKSP_が付加された名前がデフォルトになります。Oracle APEXを手作業でインストールしている場合はそのような制限はありませんが、ワークスペース名とそのワークスペースに紐づくデフォルトのスキーマ名は異なっている方が、データベースに直接接続可能なユーザー名を推測しにくくなるため、より安全だと言えます。

スキーマのパスワードを設定します。VS Codeから接続する際に、このパスワードを指定します。領域割当て制限(MB)10000(10GB)とします。Oracle Database 23c Freeのユーザー・データの制限は12GBなので、ほぼ制限なしの設定になります。

VS CodeからはSQLNet経由でデータベースに接続します。そのため、Autonomous Databaseとは異なり、データベースのユーザーに対してREST対応SQLを有効にする必要はありません。

へ進みます。


ワークスペースの管理者のユーザー名を指定します。今回の例ではadminとしています。管理者のパスワード電子メールを指定します。管理者宛の電子メールを受け取るには、送信に使用するメール・サーバーを構成する必要があります。電子メールの構成については割愛します。

へ進みます。


設定内容を確認し、ワークスペースの作成を実行します。


ワークスペースが作成されました。同時にスキーマも作成されています。

LiveLabsのLab 5とLab 6は、VS Codeから作成したスキーマに接続して実施します。



Lab 5 Configure setup materials and toolsの実施



VS Codeにデータベースへの接続追加します。

接続名は任意、ロールデフォルトです。ユーザー名パスワードにAPEXのワークスペースとともに作成したスキーマ名パスワードを指定します。パスワードの保存チェックを入れています。ホスト名localhostサービス名freepdb1です。

テストを実施し設定を確認した上で、接続を保存します。


保存された接続をクリックすると、データベースに接続されます。

以上で後続の作業をVS Codeから実施できるようになりました。


Task 1 - 3)グラフのセットアップに使用するマテリアル23cfree-property-graph.zipをダウンロードします。マテリアルは以下のURLからダウンロードします。

https://objectstorage.us-ashburn-1.oraclecloud.com/p/VEKec7t0mGwBkJX92Jn0nMptuXIlEpJ5XJA-A6C9PymRgY2LhKbjWqHeB5rVBbaV/n/c4u04/b/livelabsfiles/o/data-management-library-files/23cfree-property-graph.zip

wgetはインストールされていない場合もあるため、以下ではcurlを使ってダウンロードしています。

% curl -OL https://objectstorage.us-ashburn-1.oraclecloud.com/p/VEKec7t0mGwBkJX92Jn0nMptuXIlEpJ5XJA-A6C9PymRgY2LhKbjWqHeB5rVBbaV/n/c4u04/b/livelabsfiles/o/data-management-library-files/23cfree-property-graph.zip

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  815k  100  815k    0     0   403k      0  0:00:02  0:00:02 --:--:--  403k

% 


Task 1 - 4)ダウンロードしたマテリアル23cfree-property-graph.zipを解凍します。

unzip -o 23cfree-property-graph.zip

% unzip -o 23cfree-property-graph.zip 

Archive:  23cfree-property-graph.zip

  inflating: graph/license.txt       

  inflating: graph/.DS_Store         

  inflating: graph/CreateKeys.sql    

  inflating: graph/BANK_ACCOUNTS.csv  

  inflating: graph/license.txt       

  inflating: graph/f106.sql          

  inflating: graph/BANK_TRANSFERS.csv  

  inflating: graph/BANK_ACCOUNTS.csv  

  inflating: graph/BANK_TRANSFERS.csv  

  inflating: graph/CreateKeys.sql    

  inflating: graph/f106.sql          

% 


展開した23cfree-property-graph.zipに含まれているgraphs/CreateKeys.sqlに、以下の2行が記載されています。

load bank_transfers /home/oracle/examples/graph/BANK_TRANSFERS.csv;
load bank_accounts /home/oracle/examples/graph/BANK_ACCOUNTS.csv;

ZIPファイルの展開先が/home/oracle/examplesとは限りません。CreateKeys.sqlの存在するディレクトリに移動してから実行することを前提として、以下の2行に書き直します。

load bank_transfers ./BANK_TRANSFERS.csv;
load bank_accounts ./BANK_ACCOUNTS.csv;

CSVを表にロードするloadコマンドは、SQLclの組み込みコマンドです。そのため、CreateKeys.sqlSQLclより実行します。

接続上でコンテキスト・メニューを表示し、SQLclを開きます。


ターミナルでSQLclが開始します。パスワードを入力しデータベースにSQLclで接続します。

Task 2 - 7)最初にcdコマンドでCreateKeys.sqlがあるディレクトリに移動し、続いてCreateKeys.sqlを実行します。

@CreateKeys.sql

BANK_TRANSFER5001行、BANK_ACCOUNTS1000行のデータがロードされていることを確認します。


以上でスキーマのセットアップは完了です。

この後の作業でSQLclは使用しないので、SQLclはexitで終了します。


Lab 6 Operational Property Graphs Example with SQL/PGQ in 23 の実施



VS CodeでSQLワークシートを開いて、LiveLabsで案内されているSQLをコピペして実行することによりLab 6の演習を進めることができます。


Task 1 - 2:プロパティ・グラフBANK_GRAPHを作成します。表BANK_ACCOUNTS頂点BANK_TRANSFERSとして使用します。

CREATE PROPERTY GRAPH文を実行します。


Task 1 - 3:プロパティ・グラフBANK_GRAPHを確認します。

ビューUSER_PROPERTY_GRAPHSを検索します。


Task 1 - 4:プロパティ・グラフBANK_GRAPHを作成したDDLを表示します。

DBMS_METADATA.GET_DDLを実行します。


Task 1 - 5:プロパティ・グラフBANK_GRAPHの構成要素(頂点)を確認します。

ビューUSER_PG_ELEMENTSを検索します。


Task 1 - 6:プロパティ・グラフBANK_GRAPHが持つプロパティとそのラベルを確認します。

ビューUSER_PG_LABEL_PROPERTIESを検索します。


Task 2からはプロパティ・グラフBANK_GRAPHをSQL/PGQを使って検索しています。

Task 2 - 1:最も送金を多く受け付けている(金額ではなく回数)上位10行を、受付回数の多い順番でリストします。


Task 2 - 2:送金を中継している回数が多い上位10行を、中継回数の多い順番でリストします。


Task 2 - 3:今までの問い合わせの両方でアカウントID387が(先頭で)検索されています。アカウントID387からの送金を1から3ホップ内で受け付けた銀行とその送金を検索します。


Task 2 - 4:送金が送金元に3ホップで循環している送金を検索します。送金元の銀行から媒介している銀行へ送金され、媒介している銀行から送金元へ送金されている取引です。


Task 2 - 5:3ホップではなく4ホップのケース(中間に2行を経由する)を検索します。


Task 2 - 6:5ホップのケースを検索します。


Task 2 - 7:3から5回のホップで送金元に戻る送金を行なっている銀行を、10行リストします。


Task 2 - 8:3から5回のホップで送金元に戻る送金を行なっている銀行の上位10行を、回数の多い順番でリストします。


Task 2 - 9:表BANK_TRANSFERSに6つの送金を追加します。


Task 2 - 10Task 2 - 1で実行した問い合わせ(送金を受け付けた回数が多い上位10行)を再実行します。アカウントID387、934、135の順番が 135、934、387に変わっています。


Task 2 - 11Task 2 - 5で4ホップで循環している送金を検索しました。4ホップで循環している送金元のアカウントIDが39である件数を数えます。

結果は0件です。


Task 2 - 12:表BANK_TRANSFERSに3つの送金を追加します。


Task 2 - 13Task 2 - 11の検索を再実行します。送金元のアカウントIDが39で、送金が4ホップで送金元に循環している件数です。

循環している送金の件数が0回から5回に変わります。


Task 2 - 14:送金元のアカウントIDが39で、4ホップで送金が循環している5つの送金について、送金経路を一覧します。


Task 2 - 15:最後に演習で挿入した9行の送金を表BANK_TRANSFERSより削除します。CSVからデータをロードした直後の状態に戻るため、再度演習を行なうことができます。


Lab 6の演習は以上で終了です。


Bonus Lab Integration with APEXの実施



Bonus Labの実際の作業は、23cfree-property-graph.zipに含まれているAPEXアプリケーションf106.sqlのインポートです。以下に接続し、作成済みのワークスペースにサインインします。



管理者ユーザーによる初回接続時は、パスワードの変更を求められます。


アプリケーション・ビルダーを開きます。


アプリケーションf106.sqlのインポート作業を始めます。

インポートをクリックします。


インポートするファイルとしてf106.sqlを選択します。

へ進みます。


アプリケーションのインストールを実行します。


サポートするオブジェクトのインストールを実行します。


アプリケーションSQL Property Graph in Oracle Database 23cのインストールが完了しました。

アプリケーションを実行します。


アプリケーションに管理者ユーザーサインインします。


インポートしたアプリケーションには、Property Graph queries with SQLUsing the GraphVis Pluginの2枚のページが含まれています。

これまでの作業を実施していれば、Pre-requisitesはすべて満たした状態になっています。


Property Graph queries with SQLのページでは、主にLab 6にて実施した演習の内容が実装されています。

最初の2つのリージョンでは、送金の多い上位10行を検索しています。


続くリージョンでは、循環している送金を一覧しています。データを更新した後に確認できるよう、Refreshボタンが実装されています。


表BANK_TRANSFERSに送金を5行追加するリージョンがあります。


追加したデータを削除し表BANK_TRANSFERSを最初の状態に戻す機能は、APEXアプリケーションには実装されていないようです。Task 2 - 15のDELETE文をSQLコマンドから実行することにより、表BANK_TRANSFERSを最初の状態に戻すことができます。


Using Graph Visualization Pluginのページでは、いくつかのSELECT文の結果をGraph Visualization Pluginを使って表示しています。

Lab 6Task 2 - 2の送金を中継している回数が多い上位10行の取引を表示しています。


送金が4ホップで循環している経路を表示しています。


Lab 6のTask 2 - 14に近い検索ですが、アカウントID39で6ホップで循環している送金を表示しています。


Oracle LiveLabsのExploring Operation Property Graphs in 23c Freeの演習の紹介は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2023年4月12日水曜日

DB 23cのLock Free Reservationを使ってみる

 DB 23cよりLock Free Reservationと呼ばれる機能が追加されました。これは以下の操作を行います。

  • 数値列の操作を加算と減算に限定します。
  • 演算結果を更新する代わりに、差分をジャーナルに保存します。
  • 値が書かれているブロックは変更しないため、ロックを取得しません。値自体は変更されたように見えます。
  • 別のトランザクションが同じ行の同じ列を更新する場合も、ロックを取得せずに差分をジャーナルに保存するので待機が発生しません。
  • トランザクションのコミット時に差分を適用します。
  • SAGAが開始していて(DBMS_SAGA.BEGIN_SAGAが呼び出された後)、SAGAのロールバックが発生した(DBMS_SAGA.ROLLBACK_SAGAが呼びされる)場合は、自動的に補償トランザクションが実行されます。
この機能を実装してみて、実際に効果を確認してみます。SAGAの実装は大変なので、それは除きます。また、仕組みの詳細について解説することは、目的としていません。

効果の確認に、Oracle REST Data ServicesのRESTサービスを使います。

最初に表CALL_COUNTERを作成します。

create table call_counter(
    id number primary key,
    count number
);

あらかじめ1行データを投入します。主キーIDの値はです。UPDATEを実行するときは、条件として主キーの値を指定する必要があります。

insert into call_counter(id, count) values(1, 0);

Lock Free Reservationを有効にする場合は、以下のようにreservableを指定します。

create table call_counter(
    id number primary key,
    count number reservable
);


最初に、Lock Free Reservationなしで作業を進めます。以下のコードがGETハンドラの処理になります。


RESTfulサービスのモジュールとしてcallテンプレートとしてcountを作成し、GETハンドラを作成します。ソース・タイプPL/SQLを選択します。


テストの準備ができたので、同時にRESTサービスを呼び出してみます。RESTサービスの待機時間を含む処理時間は、5、9、12、16秒と増えていきます。countは52、53、54、55となっています。


列countをreservableに変更します。

alter table call_counter modify (count reservable);

ほとんどのリクエストが5秒で終了します。ロック待機が発生していないことが確認できます。また、逐次処理にはなっていないため、countは全部同じ値(以下では55)です。次にRESTサービスを呼び出すと、countは4が加わり59になります。


Lock Free Reservationには、このような効果があります。

reservableとなっている列がある表をドロップしようとすると、ORA-55764が発生します。そのため、表をドロップする前に列をnon reservableに変更する必要があります。

SQL> drop table call_counter;

drop table call_counter

           *

ERROR at line 1:

ORA-55764: Cannot DROP or MOVE tables with reservable columns. First run "ALTER

TABLE <table_name> MODIFY (<reservable_column_name> NOT RESERVABLE)" and then

DROP or MOVE the table.



SQL> 


以上で、Lock Free Reservationの説明は終了です。

ここまで極端なホットスポットはあまり無いとは思います。とはいえ加算と減算に操作を限定できる数値列、例えばページの訪問数やいいねをクリックした数のようなデータがある場合は、適用を検討する価値はあるでしょう。