1. はじめに
前回の記事で「Oracle Database 26ai」のRAC環境が無事に構築できたので、今回は気になっていた新機能をいくつか試してみたいと思います。(※正確には23aiから追加された機能も含みます。)
前回の記事は下部にある「関連記事」からご覧ください。
新機能のみ知りたい方は本記事から読んでいただいて問題ありません。
26aiの新機能というと、「AI Vector Search」などの機能が注目されていますが、本記事では、DBエンジニアの視点で「日々の運用や作業がちょっと楽になる、現場で使える新機能」を3つピックアップして、実際に動かしてみました
2. Oracle 26aiでの新機能3選
① IF [NOT] EXISTS のサポート(DDLのエラー回避)
テーブルなどのオブジェクト作成・削除時に、事前に存在をチェックできるようになりました。
今までは、スクリプトを再実行した際に「すでにテーブルが存在する」と、以下のようにエラーで止まってしまっていました。
SQL> CREATE TABLE test_user (id NUMBER);
ORA-00955: 名称がすでに使用されています。
しかし、26ai(23ai)からは、MySQLなどでおなじみの「 IF NOT EXISTS」 がついに使えるようになりました。
SQL> CREATE TABLE IF NOT EXISTS test_user (id NUMBER);
表が作成されました。
このように書いておけば、テーブルが既に存在していてもエラー(ORA-00955)にならず、安全に処理を続行してくれます。
逆に、テーブルを削除する時も IF EXISTS が使えます。
SQL> DROP TABLE IF EXISTS test_user;
表が削除されました。
対象のテーブルがなくても「ORA-00942(表またはビューが存在しません)」のエラーで怒られることがなくなりました。 これにより、作業の手間やミスが大きく減らせそうです。
② BIGFILE表領域の縮小機能
従来の環境でBIGFILE表領域を縮小する際は、ALTER TABLESPACE RESIZE 文を実行していました。
しかし、RESIZEコマンドは「最後に使われているブロック」より後ろの空き容量しか削ることができません。
そのため、これまでは手動で ALTER TABLE ... MOVE や ALTER INDEX ... REBUILD などを駆使して、データを前方へ詰めるという面倒な作業が必要でした。
これが26aiになると、新たに DBMS_SPACE.SHRINK_TABLESPACE プロシージャが利用可能になります。これにより、システムをオンラインにしたまま「オブジェクトの前方への再配置」と「データファイルの縮小」を、データベース側が自動で同時に実行してくれるようになりました。
DBMS_SPACE.SHRINK_TABLESPACE プロシージャのコマンドは以下の通りです。
DBMS_SPACE.SHRINK_TABLESPACE(tablespace_name,shrink_mode,target_size);
shrink_modeで指定できるモードは以下の通りです。
| モードを示す定数 | 説明 |
| TS_MODE_ANALYZE | 縮小可能か分析を行う |
| TS_MODE_SHRINK ※デフォルト |
オンラインでオブジェクトを移動し、データファイルの縮小を行う |
| TS_MODE_SHRINK_FORCE | オンラインでオブジェクトの移動に失敗するとオフラインで縮小を行う |
事前に作成したTEST_TS表領域を使用し、実際にプロシージャを実行してみます。
まずは従来のやり方で、サイズを縮小します。
--現在の表領域のサイズを確認
SQL>SELECT tablespace_name, bytes / 1024 / 1024 AS size_mb FROM dba_data_files WHERE tablespace_name = 'TEST_TS';
TABLESPACE_NAME SIZE_MB
-------------------- ----------
TEST_TS 1024
--300MBまで縮小するSQL>ALTER DATABASE DATAFILE '+DATA/DBAI26/DATAFILE/ test_ts.273.123358587' RESIZE 300M;
行1でエラーが発生しました。:
ORA-03297:
ファイルには、リクエストしたRESIZE値を超える使用中のデータが含まれています。
続いて、新機能であるDBMS_SPACE.SHRINK_TABLESPACEパッケージを使用して、同じく300MBまで縮小します。
SQL> SET SERVEROUTPUT ON
SQL>EXECUTE DBMS_SPACE.SHRINK_TABLESPACE('TEST_TS',DBMS_SPACE.TS_MODE_SHRINK,300*1024*1024);Specified target size is too small, adjusting it to 348127232
-------------------SHRINK RESULT-------------------
Total Moved Objects: 0
Total Moved Size(GB): 0
Original Datafile Size(GB): 1
New Datafile Size(GB): .32
Process Time: +00 00:00:04.010450PL/SQLプロシージャが正常に完了しました。
--再度、表領域のサイズを確認
SQL>SELECT tablespace_name, bytes / 1024 / 1024 AS size_mb FROM dba_data_files WHERE tablespace_name = 'TEST_TS';TABLESPACE_NAME SIZE_MB
-------------------- ----------
TEST_TS 332
DBMS_SPACE.SHRINK_TABLESPACE を実行した結果、ファイルサイズは1GBから 332MB へと縮小しました。
※300MBに縮小と指定したのに縮小後のサイズが332MBとなっているのは、332MBの地点にシステム上削除できない管理ブロック(セグメント・ヘッダー)が残っていたためです。
コマンドの結果だけを見ると「ただファイルを削っただけ」に見えますが、裏側でデータを前詰めして隙間を無くしたからこそ、ファイルサイズを小さくできたというのがこの新機能の特徴です。
③ FROM句なしのSELECT
19cまでは、SELECT文には必ずFROM句が必要でしたが、新しいバージョンでは、ついにこのFROM DUALが省略可能になりました。
--今までのOracle
SQL> select sysdate;
select sysdate
*
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。★19cではFROM句が必須のため、エラーになる
--「from dual」を指定し、実行
SQL> select sysdate from dual;
SYSDATE
--------
26-04-28
--26aiからのOracle
--「from dual」なしで実行可能SQL> select sysdate;
SYSDATE
--------
26-04-28
この通り、見事に FROM DUAL なしで結果が返ってきます。
機能としてはシンプルですが、毎日何度もコマンドを叩くDBAとしては、少しでもタイピングが減るのはありがたい機能です。
3. おわりに
今回は、Oracle Database 26aiの環境を使って、DBエンジニア目線で嬉しい新機能を3つ紹介しました。
話題のAI機能だけでなく、運用現場の作業をちょっと楽にしてくれる機能もしっかり追加された、DBエンジニアにも嬉しいバージョンアップですね。
前回の「構築編」と合わせて、これから26aiの環境を触ってみようという方の参考になれば嬉しいです。
最後まで読んでいただき、ありがとうございました。
■参考資料
・Oracle AI Database新機能
https://docs.oracle.com/cd/G47991_01/nfcoa/appdev_sql.html
https://docs.oracle.com/cd/G47991_01/nfcoa/oltp_general.html#GUID-87022-1




