2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Oracle】実際に触って学ぶBronze DBA(26ai)#1-5:26aiの新機能と、バージョン番号の読み方

2
Last updated at Posted at 2026-09-16

はじめに

この記事は、ORACLE MASTER Bronze DBA(Oracle AI Database 26ai / 1Z0-185-JPN)の試験範囲を題材に、実際に手を動かしながら理解を深めていく連載の5回目です。

検証には Oracle AI Database 26ai Free(CDB=FREE / PDB=FREEPDB1)を使っています。Vagrant + VirtualBox での構築手順は以下にまとめています。

過去回はこちらです。

免責

この連載「実際に触って学ぶBronze DBA(26ai)」は、ORACLE MASTER Bronze DBA(Oracle AI Database 26ai / 1Z0-185-JPN)の試験範囲を題材に、実際に手を動かしながら理解を深めることを目的としています。

本連載は合格保証や試験対策そのものを目的とするものではありません。試験範囲を使い、その一つひとつを実機で確かめていく知識補完の記事、という位置づけです。

今回記事の範囲

第1章:Oracleデータベース管理の概要

  • リレーショナル・データベースおよびSQLの理解 … #1-1(済)
  • インスタンスおよびデータベースのコンポーネントの理解 … #1-2(済)
  • マルチテナント・コンテナ・データベースの利点の理解 … #1-4(済)
  • データベース・ファイルの理解 … #1-3(済)
  • Oracleデータベースの管理に使用するツールの理解 … #1-1(済)
  • Oracleデータベースの重要な用語の理解 … #1-1(済)
  • Oracle AI Database 26aiの新機能の概要 … 今回
  • Oracle AI Database 26aiの特徴と利点 … 今回

今回で第1章は完結です。

前回(#1-4)の振り返り

前回は、自分の手でPDBを1つ作り、マルチテナント・アーキテクチャの4つの利点(リソース効率・高速プロビジョニング・可搬性・一括管理)を実機で確かめました。マンションの建物がCDB、部屋がPDB、というたとえで整理した回です。

「26ai」という名前

26aiは、Oracle AI Databaseの長期サポート・リリースです。公式の新機能ガイドは、26aiについて「AIと開発者の生産性を重視した300以上の新機能が含まれている」と説明しています。

ここで最初につまずきやすいのが、名前とバージョン番号が食い違って見えることです。26aiを名乗っているのに、実際のバージョン番号は 23 から始まります。

#1-4までのマンションのたとえを借りるなら、これは建て替えではなくリフォームです。23aiという建物を取り壊して新しく建て直したのではなく、同じ建物のまま看板を掛け替えて、共用設備を増築した。だから住所(=先頭のバージョン番号)は変わっていない、というイメージです。

実際、公式の新機能ガイドの付録Aには、リリース更新(RU)の一覧として

  • リリース更新 23.5 / 23.6 / 23.7 / 23.8 / 23.9
  • リリース更新 23.26.0 / 23.26.1

という章がひとつながりに並んでいます。23aiの時代のRUと、26aiを名乗るようになってからのRUが、同じ連番の延長線上にあるわけです。

それでは、自分の環境のバージョンを確認してみましょう。

バージョンを確認する

CDB$ROOT で実行します。

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

まずは V$VERSION です。3つの列を順に見ます。

SQL> SELECT banner FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

SQL> SELECT banner_full FROM v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free
Version 23.26.2.0.0

SQL> SELECT banner_legacy FROM v$version;

BANNER_LEGACY
--------------------------------------------------------------------------------
Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

BANNER_FULL だけが2行になっています。これは偶然ではありません。データベース・リファレンスによれば、BANNER_FULLOracle Database 18cで導入された新しい2行バナー形式で、BANNER_LEGACY18cより前に使われていた従来の1行バナーです。そして BANNER_LEGACYBANNER と同じ値を表示します。

次に V$INSTANCE を見ます。ここが今回いちばんおもしろいところです。

SQL> SELECT version, version_full FROM v$instance;

VERSION           VERSION_FULL
----------------- -----------------
23.0.0.0.0        23.26.2.0.0

同じデータベースなのに、VERSION23.0.0.0.0VERSION_FULL23.26.2.0.0 と、違う値が返ってきました。

これも V$VERSION と同じ理屈です。V$INSTANCE には VERSION / VERSION_LEGACY / VERSION_FULL の3つの列があり、リファレンスの説明では

  • VERSION_FULL … 18cで導入された新しいバージョン・スキームの文字列
  • VERSION_LEGACY … 18cより前の従来のバージョンVERSION 列と同じ値)

とされています。つまり VERSION は昔ながらの表記方法で、リリース更新の情報が落ちた形になっているわけです。

補足
VERSION を見ても、そのデータベースにどのリリース更新が当たっているかは分かりません。23.0.0.0.0 としか出てこないからです。パッチレベルまで知りたいときは VERSION_FULL(または BANNER_FULL)を見ます。

PRODUCT_COMPONENT_VERSION でも同じことが確認できます。

SQL> COLUMN product FORMAT A55
SQL> SELECT product, version, version_full, status FROM product_component_version;

PRODUCT
-------------------------------------------------------
VERSION
--------------------------------------------------------------------------------
VERSION_FULL
--------------------------------------------------------------------------------
STATUS
--------------------------------------------------------------------------------
Oracle AI Database 26ai Free
23.0.0.0.0
23.26.2.0.0
Develop, Learn, and Run for Free

PRODUCT 列が Oracle AI Database 26ai Free になっています。製品名の改称が、データディクショナリの中にもきちんと反映されているのが分かります。

最後に、これから何度か出てくる COMPATIBLE を確認しておきます。

SQL> SHOW PARAMETER compatible

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      23.6.0
noncdb_compatible                    boolean     FALSE

COMPATIBLE は、新しいリリースの機能をどこまで有効にするかを決めるパラメータです。データベース・リファレンスには、26aiのリリース更新23.6以降での既定値は 23.6.0 と明記されています。この環境もそのとおりの値になっていますね。

この 23.6.0 という値が、次のセクションで効いてきます。

4つの「バージョン」の読み分け

見る場所 今回の値 何が分かるか
V$VERSION.BANNER Oracle AI Database 26ai Free Release 23.26.2.0.0 ... 従来形式の1行バナー
V$VERSION.BANNER_FULL 上記 + Version 23.26.2.0.0 18c以降の2行バナー。パッチレベルまで分かる
V$INSTANCE.VERSION 23.0.0.0.0 従来形式。RUの情報は落ちる
V$INSTANCE.VERSION_FULL 23.26.2.0.0 18c以降の新スキーム。実際に当たっているRUが分かる

新機能の全体像

「300以上の新機能」と言われても途方に暮れるので、公式の新機能ガイドが冒頭に挙げている「機能ハイライト」をもとに、大きく4つに分けて整理します。Bronzeの範囲としては、名前と、それが何のためのものかが結びつけば十分だと考えています。

分類 代表的な機能 ひとこと
AI AI Vector Search ベクトルをデータベースに格納し、キーワードではなく意味で検索する
開発者向け JSONリレーショナル二面性 同じデータを、JSONドキュメントとしてもリレーショナル表としても扱える
開発者向け SQLでの操作プロパティ・グラフ(SQL/PGQ) グラフ分析を、運用中のデータに対してSQLで直接行える
開発者向け JavaScriptストアド・プロシージャ データベース内でJavaScriptのストアド・プロシージャを書ける
開発者向け データ・ユース・ケース・ドメイン 「この列はメールアドレスである」といった用途を宣言し、検証などを共通化する
開発者向け 多くのデータ型とSQLの機能拡張 BOOLEAN型、FROM句なしSELECT、GROUP BYでの別名指定 など
開発者向け マイクロサービス・サポート / TxEventQのKafka API サービス間トランザクションの実装を簡素化。Kafkaアプリを最小限の変更でOracleに向けられる
OLTP・運用 ロックフリー予約 行をロックせずに、列の値の一部(残高や在庫など)を予約する
OLTP・運用 優先トランザクション 優先度の高いトランザクションを妨げる低優先度のものを自動的に中断する
OLTP・運用 シャーディングの機能拡張(Raftレプリケーション) シャード・レプリカの作成と管理を簡単にする
セキュリティ Oracle SQL Firewall 不正なSQLやSQLインジェクションを監視・ブロックする。本体に含まれている
セキュリティ スキーマ権限 システム権限をスキーマ単位で付与でき、権限管理が簡素になる
セキュリティ DB_DEVELOPER_ROLE アプリ開発に必要な権限だけをまとめて割り当てられる新しいロール
セキュリティ Azure AD OAuth2統合 Microsoft Azure Cloudからのシングル・サインオン

どのリリース更新で入ったのかを調べたいとき

「これは23aiの機能なのか、26aiで入ったのか」は迷いやすいところです。ここは推測せず、公式の新機能ガイドの付録A「Oracle AI Database 26aiのリリース更新」を見るのが確実です。RUごとに、そこで追加された機能が一覧になっています。

たとえばこの記事で後ほど試す機能は、付録Aで次のように整理されています。

機能 付録Aでの掲載箇所
QUALIFY句のサポート リリース更新 23.26.0
DATEDIFF関数のサポート リリース更新 23.26.1
BOOLEANデータ型 / IF [NOT] EXISTS / VECTORデータ型 23.26.x の章には無く、それ以前から入っている

なお、筆者が確認した時点(2026年2月版)の新機能ガイドは、付録Aが23.26.1まででした。今回の環境は 23.26.2.0.0 なので、まだ付録に反映されていない更新が1回分あることになります。

新機能① AI Vector Search

26aiの看板機能です。公式のAI Vector Searchユーザーズ・ガイドは、これを「キーワードではなくセマンティクス(意味)に基づいてデータを問い合わせられる仕組み」と説明しています。

その土台になるのが VECTOR データ型です。ドキュメントには、VECTOR データ型を使うには COMPATIBLE を 23.4.0 以上に設定する必要があると書かれています。先ほど確認したとおり、この環境の COMPATIBLE23.6.0 なので条件を満たしています。

「AI」と聞くと身構えてしまいますが、まず押さえるべきは新しいデータ型がひとつ増えたということです。ここは実際に触ってみるのが早いです。

ベクトルを格納して検索してみる

さっそく実機で確認します。以下は CDB ルート(CDB$ROOT)に SYSDBA で接続して実行します。

$ vagrant ssh
$ sudo su - oracle
$ sqlplus / as sysdba

FREEPDB1 で実行します。SYSスキーマに検証用の表を作りたくないので、ローカルユーザーを1つ作り、最後にまとめて削除します。

SQL> ALTER SESSION SET CONTAINER = FREEPDB1;

Session altered.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
FREEPDB1

SQL> CREATE USER demo26 IDENTIFIED BY "Demo26ai#1"
  2    DEFAULT TABLESPACE users
  3    QUOTA UNLIMITED ON users;

User created.

3次元のベクトル列を持つ表を作ります。

SQL> CREATE TABLE demo26.fruits (
  2    id   NUMBER PRIMARY KEY,
  3    name VARCHAR2(30),
  4    v    VECTOR(3, FLOAT32)
  5  );

Table created.

SQL> DESC demo26.fruits
 Name       Null?    Type
 ---------- -------- --------------------------
 ID         NOT NULL NUMBER
 NAME                VARCHAR2(30)
 V                   VECTOR(3, FLOAT32, DENSE)

DESC の結果に注目してください。定義したのは VECTOR(3, FLOAT32) なのに、表示は VECTOR(3, FLOAT32, DENSE) になっています。指定しなかった3つ目の要素(格納形式)が補われているわけです。

値を入れます。文字列からベクトルへの変換には TO_VECTOR を使います。

SQL> INSERT INTO demo26.fruits VALUES (1, 'apple',  TO_VECTOR('[1.0, 0.1, 0.0]'));
SQL> INSERT INTO demo26.fruits VALUES (2, 'orange', TO_VECTOR('[0.9, 0.2, 0.1]'));
SQL> INSERT INTO demo26.fruits VALUES (3, 'hammer', TO_VECTOR('[0.0, 0.1, 1.0]'));
SQL> COMMIT;

Commit complete.

SQL> COLUMN name FORMAT A10
SQL> COLUMN v    FORMAT A52
SQL> SELECT id, name, v FROM demo26.fruits ORDER BY id;

        ID NAME       V
---------- ---------- ----------------------------------------------------
         1 apple      [1.0E+000,1.00000001E-001,0]
         2 orange     [8.99999976E-001,2.00000003E-001,1.00000001E-001]
         3 hammer     [0,1.00000001E-001,1.0E+000]

入れたはずの 0.11.00000001E-001 になっています。列を FLOAT32(32ビット浮動小数点)で定義したため、10進の 0.1 が2進で正確に表現できず、近い値に丸められているわけです。バグではなく、指定した型どおりの動作です。

では、apple のベクトル [1.0, 0.1, 0.0] に近い順に並べてみます。距離の計算には VECTOR_DISTANCE を使います。

SQL> COLUMN dist FORMAT 0.999999
SQL> SELECT name,
  2         VECTOR_DISTANCE(v, TO_VECTOR('[1.0, 0.1, 0.0]'), COSINE) AS dist
  3  FROM   demo26.fruits
  4  ORDER  BY dist;

NAME            DIST
---------- ---------
apple       0.000000
orange      0.012862
hammer      0.990099

apple 自身との距離は0、orange は0.0129と非常に近く、hammer は0.99と遠い。狙いどおりの並びになりました。

もちろん実際のAI用途では、この3次元の値を手で書くのではなく、埋込みモデルが文章や画像から数百〜数千次元のベクトルを生成します。ただ仕組みとしては、今やったことの延長です。「意味が近いものは、ベクトル空間でも近い場所にある」という性質を利用して、距離の小さい順に並べているだけです。

表を削除しておきます。

SQL> DROP TABLE demo26.fruits PURGE;

Table dropped.

ベクトル索引の前提を確認する

ここまでの検索は、全行のベクトルを1つずつ計算する総当たりです。3行なら一瞬ですが、数百万行になるとそうはいきません。そこで使うのがベクトル索引です。26aiには大きく2種類あります。

  • HNSW(インメモリー近傍グラフ索引) … SGA上にグラフ構造を展開する、メモリー常駐型の索引
  • IVF(近傍パーティション索引) … ベクトルを距離でクラスタリングしてまとめる、ディスクベースの索引

そして、これらを使うにはベクトル・プールというSGA内の領域が必要です。オンプレミス環境でベクトル・プールのサイズを設定するには VECTOR_MEMORY_SIZE 初期化パラメータを使います。IVFの重心ベクトルもこのプールに格納されます。

今回の環境がどうなっているか見てみましょう。CDB$ROOT に戻ります。

SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;

Session altered.

SQL> SHOW PARAMETER vector_memory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
vector_memory_size                   big integer 0

SQL> SHOW PARAMETER sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 660M

VECTOR_MEMORY_SIZE0 です。これはデータベース・リファレンスに記載されているとおりの既定値で、値の範囲は「SGAサイズの0から70%」とされています。

SGAの内訳を見ると、もっとはっきりします。

SQL> SELECT name, bytes/1024/1024 AS mb, resizeable FROM v$sgainfo ORDER BY name;

NAME                             MB RES
------------------------ ---------- ---
Buffer Cache Size               252 Yes
Data Transfer Cache Size          0 Yes
Fixed SGA Size           4.79750824 No
Free SGA Memory Available         0
Granule Size                      4 No
In-Memory Area Size               0 No
Java Pool Size                    0 Yes
Large Pool Size                   4 Yes
Maximum SGA Size         656.797508 No
Redo Buffers                      4 No
Shared IO Pool Size              28 Yes
Shared Pool Size                392 Yes
Startup overhead in Shar 212.637856 No
ed Pool
Streams Pool Size                 0 Yes
Vector Memory Area Size           0 No

15 rows selected.

Vector Memory Area Size0 MB です。ベクトル・プールは確保されていません。

念のため、ベクトル・プールの状態を見るビューも確認します。

SQL> SELECT * FROM v$vector_memory_pool;

no rows selected

ビュー自体は存在しますが、行がありません。プールが無効なので当然です。

本記事ではベクトル索引は作成しません。

Free版は最大RAMが2GBに制限されており、実際このインスタンスのSGA全体が約657MBです。VECTOR_MEMORY_SIZE に割り当てられるのは最大でもそのうちの70%までなので、そもそも余裕がありません。そして本連載の方針として、環境に恒久的な変更を残す操作は避けたいところです。
Bronzeのレベルでは、**「ベクトル索引を使うにはベクトル・プールが必要で、それは VECTOR_MEMORY_SIZE で設定する」**という前提を知っていれば十分だと考えています。

新機能② 開発者向けのSQL拡張

AI機能と並んで26aiの柱になっているのが、SQLそのものの拡張です。公式の新機能ガイドには「SQLとPL/SQLの大幅な改善も含まれており、新しいデータ型と言語拡張が導入されている」とあります。

ここは実際に動かすのが一番わかりやすいので、順に試していきます。

BOOLEAN型とIF [NOT] EXISTSを試す

FREEPDB1 に戻ります。

SQL> ALTER SESSION SET CONTAINER = FREEPDB1;

Session altered.

BOOLEANデータ型は、新機能ガイドで「ISO SQL標準準拠のBOOLEANデータ型がサポートされ、TRUE値およびFALSE値を表に格納できる」と説明されている機能です。これまでOracleでは NUMBER(1)CHAR(1) で代用するのが定番でしたが、正式な型が入りました。

IF [NOT] EXISTS は、DDLに付けられる修飾子です。同じくガイドでは「オブジェクトの作成、変更および削除で IF EXISTS および IF NOT EXISTS がサポートされ、スクリプトやアプリケーションでのエラー処理を簡略化できる」とされています。

両方を一度に使ってみます。

SQL> CREATE TABLE IF NOT EXISTS demo26.tasks (
  2    id      NUMBER PRIMARY KEY,
  3    title   VARCHAR2(40),
  4    is_done BOOLEAN
  5  );

Table created.

SQL> DESC demo26.tasks
 Name       Null?    Type
 ---------- -------- --------------
 ID         NOT NULL NUMBER
 TITLE               VARCHAR2(40)
 IS_DONE             BOOLEAN

BOOLEAN が、そのまま型として表示されました。

値を入れて確認します。

SQL> INSERT INTO demo26.tasks VALUES (1, 'write the draft', TRUE);
SQL> INSERT INTO demo26.tasks VALUES (2, 'run on the lab',  FALSE);
SQL> INSERT INTO demo26.tasks VALUES (3, 'publish',         FALSE);
SQL> COMMIT;

Commit complete.

SQL> COLUMN title FORMAT A20
SQL> SELECT * FROM demo26.tasks ORDER BY id;

        ID TITLE                IS_DONE
---------- -------------------- -----------
         1 write the draft      TRUE
         2 run on the lab       FALSE
         3 publish              FALSE

TRUE / FALSE がそのまま格納され、そのまま表示されています。

BOOLEAN列は、= TRUE と書かずにそのまま条件として使えます

SQL> SELECT title FROM demo26.tasks WHERE is_done;

TITLE
--------------------
write the draft

SQL> SELECT title FROM demo26.tasks WHERE NOT is_done;

TITLE
--------------------
run on the lab
publish

WHERE is_done / WHERE NOT is_done で意図どおりに絞り込めました。NUMBER(1) で代用していた頃の WHERE is_done = 1 と比べると、読みやすさが違います。

次に IF NOT EXISTS の効き方を確かめます。すでに表がある状態で、同じCREATE文をもう一度実行します。

SQL> CREATE TABLE IF NOT EXISTS demo26.tasks (
  2    id      NUMBER PRIMARY KEY,
  3    title   VARCHAR2(40),
  4    is_done BOOLEAN
  5  );

Table created.

エラーになりません。ただしここで一点、注意が必要です

SQL> SELECT COUNT(*) FROM demo26.tasks;

  COUNT(*)
----------
         3

行数は3のままです。つまり表は作り直されておらず、既存の表がそのまま残っています。Table created. というメッセージは出ますが、実際には何も起きていないわけです。メッセージを鵜呑みにして「表が作り直された」と誤解しないよう気をつけてください。

IF NOT EXISTS を付けない場合との対比も見ておきます。

SQL> CREATE TABLE demo26.tasks (id NUMBER);
CREATE TABLE demo26.tasks (id NUMBER)
                    *
ERROR at line 1:
ORA-00955: name is already used by an existing object

おなじみの ORA-00955 です。この ORA-00955 をスクリプト側でハンドリングしなくて済むようにするのが IF NOT EXISTS の役目、ということになります。

DROPも同じです。後片付けを兼ねて試します。

SQL> DROP TABLE demo26.tasks PURGE;

Table dropped.

SQL> DROP TABLE demo26.tasks PURGE;
DROP TABLE demo26.tasks PURGE
                  *
ERROR at line 1:
ORA-00942: table or view "DEMO26"."TASKS" does not exist

SQL> DROP TABLE IF EXISTS demo26.tasks;

Table dropped.

2回目の DROP TABLEORA-00942 になりますが、IF EXISTS を付けると(対象が存在しなくても)エラーになりません。冪等なスクリプトを書くときに効いてくる機能です。

なお、ここでも表示は Table dropped. です。「削除した」のか「もともと無かった」のかは、メッセージからは区別できません

表を作らずに試せる新構文

ここから先は、オブジェクトを一切作らずに試せるものです。環境に何も残りません。

FROM句なしのSELECT

これまでOracleでは、式だけを評価したいときにも FROM DUAL が必要でした。26aiではそれが不要になります。新機能ガイドは「FROM句なしでSELECT式のみの問合せを実行できるようになり、SQLコードの移植性と開発者の使いやすさが向上する」と説明しています。

SQL> SELECT 1 + 1;

       1+1
----------
         2

SQL> SELECT SYSDATE;

SYSDATE
---------
15-SEP-26

SQL> SELECT 'Oracle AI Database' || ' 26ai';

'ORACLEAIDATABASE'||'26
-----------------------
Oracle AI Database 26ai

DUAL を書かなくてよくなりました。他のデータベースから来た人が最初に戸惑うポイントが1つ減った、と言えます。

DATEDIFF(リリース更新 23.26.1)

付録Aで「リリース更新23.26.1」に載っている、比較的新しい関数です。新機能ガイドには「DATEDIFFとそのシノニムTIMESTAMPDIFFは、日時差異計算のための強力なユーティリティを導入する」「他のすべてのデータベースでサポートされており、移行を容易にする」とあります。

SQL言語リファレンスによれば、引数は time_unit / start_datetime / end_datetime の3つで、time_unit には YEAR MONTH DAY WEEK QUARTER HOUR MINUTE SECOND などを指定します。

SQL> SELECT DATEDIFF(DAY, DATE '2026-01-01', DATE '2026-09-15');

DATEDIFF(DAY,DATE'2026-01-01',DATE'2026-09-15')
-----------------------------------------------
                                            257

SQL> SELECT DATEDIFF(MONTH, DATE '2026-01-01', DATE '2026-09-15');

DATEDIFF(MONTH,DATE'2026-01-01',DATE'2026-09-15')
-------------------------------------------------
                                                8

SQL> SELECT TIMESTAMPDIFF(DAY, DATE '2026-01-01', DATE '2026-09-15');

TIMESTAMPDIFF(DAY,DATE'2026-01-01',DATE'2026-09-15')
----------------------------------------------------
                                                 257

FROM句なしSELECTと組み合わさって、ずいぶん短く書けるようになっています。TIMESTAMPDIFF がシノニムであることも、同じ値が返ることで確認できました。

表値コンストラクタ(VALUES句)

VALUES 句を使って、表に依存せずその場で行を作れる機能です。ガイドでは「既存の表に依存せずに新しい構文で指定することで、データ行をその場でマテリアライズ化できる」と説明されています。

ただし、書き方に注意が必要です。まずエイリアスを付けずに書いてみます。

SQL> SELECT * FROM (VALUES (1,'a'),(2,'b'),(3,'c'));
SELECT * FROM (VALUES (1,'a'),(2,'b'),(3,'c'))
                                                   *
ERROR at line 1:
ORA-00931: missing identifier

ORA-00931 になりました。表エイリアスと列名のリストが必要です。

SQL> SELECT * FROM (VALUES (1,'a'),(2,'b'),(3,'c')) t(id, nm);

        ID N
---------- -
         1 a
         2 b
         3 c

今度は通りました。当然ですが、通常の問合せと同じように扱えます。

SQL> SELECT id, nm FROM (VALUES (1,'a'),(2,'b'),(3,'c')) t(id, nm) ORDER BY id DESC;

        ID N
---------- -
         3 c
         2 b
         1 a

動作確認用の小さなデータを用意するのに、いちいち表を作らなくて済みます。

QUALIFY句(リリース更新 23.26.0)

これも26aiになってから入った機能です。新機能ガイドの説明が的確なので引用に近い形で紹介すると、QUALIFYSELECT 文で分析関数の結果をフィルタ処理する句であり、QUALIFY と分析関数の関係は、HAVINGGROUP BY の関係に似ています。

これまでは、分析関数の結果で絞り込むには問合せをネストして親問合せでフィルタするしかなく、ガイドはそれを「冗長になり、メンテナンスのオーバーヘッドが増え、問合せの意図が読み手にわかりにくくなる」と表現しています。

実際に使ってみます。オブジェクト種別ごとに、名前順で先頭の1件だけを取り出す問合せです。

SQL> COLUMN object_name FORMAT A30
SQL> SELECT object_type, object_name, created
  2  FROM   dba_objects
  3  WHERE  owner = 'SYS' AND object_type IN ('TABLE','VIEW','INDEX')
  4  QUALIFY ROW_NUMBER() OVER (PARTITION BY object_type ORDER BY object_name) = 1;

OBJECT_TYPE             OBJECT_NAME                    CREATED
----------------------- ------------------------------ ---------
INDEX                   ACCHK_EVENTS_FK                28-APR-26
TABLE                   AC$CONFIG_PARAMS               28-APR-26
VIEW                    ACLMV$_BASE_VIEW               28-APR-26

副問合せを1段も書かずに済みました。19cまでなら、ROW_NUMBER() を付けたインラインビューを作り、その外側で WHERE rn = 1 と書く必要があったところです。

UUID()

最後にひとつ。新機能ガイドによると、SQL関数 UUID()RFC 9562 に従ってバージョン4・バリアント1のUUIDを生成します。従来の SYS_GUID() は「必ず、最適ではない予測可能な一連の一意識別子が生成される」と説明されており、その課題に応えるものです。

SQL> SELECT UUID();

UUID()
--------------------------------
ED8EBB4521D1418A9A8BBD459703EDDD

ハイフンなしの32桁16進で返ってきました。4桁ずつ区切ると ED8EBB45-21D1-418A-9A8B-BD459703EDDD となり、13桁目が 4(バージョン4)、17桁目が 9(バリアント1)で、ドキュメントの記載と一致しています。

ここで作った検証用ユーザーを削除して、環境を元に戻します。

SQL> DROP USER demo26 CASCADE;

User dropped.

SQL> SELECT username FROM dba_users WHERE username = 'DEMO26';

no rows selected

これで、この記事で作ったオブジェクトはすべて消えました。

新機能③ 運用・可用性・セキュリティ

DBA視点の変化にも触れておきます。新機能ガイドは、26aiでは「多数の主要な管理タスクがさらに改善されて複雑さが軽減され、タスクの簡略化のための新機能(表領域内の空き領域の再利用など)が導入されている」とし、True Cacheなどのインフラストラクチャ・レベルの改善にも言及しています。

Bronzeの範囲としては、以下の名前と役割が結びついていれば十分でしょう。

機能 何をするものか
Oracle SQL Firewall 不正なSQLやSQLインジェクション攻撃を監視・ブロックする。Oracle AI Databaseに含まれている(別製品ではない)
スキーマ権限 システム権限をスキーマ・レベルで付与できる。権限管理が簡素になる
DB_DEVELOPER_ROLE アプリケーション開発に必要な権限だけをまとめて割り当てられるロール
True Cache 読み取り性能を上げるためのインフラ側の仕組み
ロックフリー予約 行をロックせずに、残高や在庫の一部を予約する
優先トランザクション 優先度の高いトランザクションを妨げる低優先度のものを自動的に中断する

このうち DB_DEVELOPER_ROLE は、ロールとして実在することをすぐ確認できます。

SQL> SELECT role, oracle_maintained FROM dba_roles WHERE role = 'DB_DEVELOPER_ROLE';

ROLE                           O
------------------------------ -
DB_DEVELOPER_ROLE              Y

ORACLE_MAINTAINEDY なので、Oracleが提供・管理しているロールであることも分かります。

Free版で試せるもの/試せないもの

学習環境としてFree版を使ううえで、公式のインストレーション・ガイドに書かれている制限は把握しておきたいところです。

項目 制限 超えたときのエラー
CPU 処理用に2コアに自動的に制限される (エラーにはならず、性能が頭打ちになる)
RAM 最大2GBを超えられない
ユーザー・データ 最大12GBを超えられない ORA-12954
インストール数 1つの論理環境(VM、コンテナ、物理ホスト)につき1つ ORA-00442

今回の記事で触れた範囲で言えば、VECTOR データ型とベクトル検索そのものは問題なく試せます。一方で、ベクトル索引はメモリー制限が厳しいため、学習目的で本格的に触るならクラウド側の環境を検討することになるでしょう。

ちなみに「Free版だから機能が削られている」というよりは、リソースの上限が決まっている、という理解のほうが実態に近いです。機能ごとの利用可否はライセンス情報ユーザー・マニュアルに整理されているので、気になる機能があればそちらを確認するのが確実です。

まとめ

第1章の最後として、26aiの新機能を見てきました。要点は3つです。

  1. 26aiは23aiと同じ系列である。だからバージョン番号は 23 から始まる
  2. VERSION ではリリース更新が分からないVERSION_FULLBANNER_FULL を見る
  3. 新機能はAI/開発者向け/運用・可用性/セキュリティの4方向。どのRUで入ったかは公式の新機能ガイド付録Aで確認できる

「新機能」という言葉には身構えてしまいますが、今回試したものの多くは BOOLEAN 型や IF NOT EXISTS のような、日々のSQLを少し楽にしてくれる地味な改善でした。看板になっているAI Vector Searchにしても、入口は「新しいデータ型が1つ増えた」というだけの話です。

用語

用語 意味
Oracle AI Database 26ai Oracle AI Databaseの長期サポート・リリース。23aiと同じ系列で、バージョン番号は23から始まる
長期サポート・リリース 他のリリースより長くサポートが提供される位置づけのリリース
リリース更新(RU) 四半期ごとに提供される更新。23.26.0 23.26.1 のように番号が進む
COMPATIBLE 新しいリリースの機能をどこまで有効にするかを決める初期化パラメータ。26ai RU23.6以降の既定値は 23.6.0
VECTORデータ型 ベクトル埋込みをデータベースに格納するためのデータ型。COMPATIBLE 23.4.0以上が必要
ベクトル・プール ベクトル索引が使用するSGA内の領域。VECTOR_MEMORY_SIZE で設定し、既定値は0
HNSW索引 インメモリー近傍グラフ・ベクトル索引
IVF索引 近傍パーティション・ベクトル索引
BOOLEANデータ型 ISO SQL標準準拠の真偽値型。TRUE / FALSE を格納できる
IF [NOT] EXISTS DDLに付ける修飾子。対象の有無によるエラーを回避する
QUALIFY句 分析関数の結果をフィルタする句。分析関数における HAVING に相当(RU 23.26.0)
表値コンストラクタ VALUES 句で、表に依存せず行をその場で生成する仕組み
DATEDIFF 2つの日時の差を指定した単位で返す関数。TIMESTAMPDIFF はシノニム(RU 23.26.1)
UUID() RFC 9562準拠のバージョン4 UUIDを生成するSQL関数

主要コマンド

コマンド 用途
SELECT banner_full FROM v$version; 2行バナー形式でバージョンを確認する
SELECT version, version_full FROM v$instance; 従来形式と新形式のバージョンを並べて確認する
SELECT product, version_full, status FROM product_component_version; 製品名とバージョンを確認する
SHOW PARAMETER compatible COMPATIBLE の値を確認する
SHOW PARAMETER vector_memory_size ベクトル・プールのサイズ設定を確認する
SELECT name, bytes/1024/1024 FROM v$sgainfo; SGAの内訳(Vector Memory Area Size を含む)を確認する
CREATE TABLE t (v VECTOR(3, FLOAT32)); ベクトル列を持つ表を作成する
TO_VECTOR('[1.0, 0.1, 0.0]') 文字列をベクトルに変換する
VECTOR_DISTANCE(v1, v2, COSINE) 2つのベクトルの距離を計算する
CREATE TABLE IF NOT EXISTS ... 表が無いときだけ作成する
DROP TABLE IF EXISTS ... 表があるときだけ削除する
... QUALIFY ROW_NUMBER() OVER (...) = 1 分析関数の結果で行を絞り込む
DATEDIFF(DAY, d1, d2) 2つの日時の差を日数で返す

次回予告

第1章はこれで完結です。次回からは第2章に進みます。ここまでで作った実機環境をそのまま使い続けますので、まだ環境を作っていない方は構築記事からどうぞ。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?