2022/12/21

Oracle TimesTen In-Memory Database Express Edition(XE)を試してみる

この記事は JPOUG Advent Calendar 2022 の21日目です。
20日目は 凌直孝 さんの記事『OracleCloudのPaaS利用時とOnP利用時の保守料の違いとは』でした。

はじめに

Oracle でインメモリといえば Oracle Database In-Memory が思い浮かびますが、2005 年に Oracle が買収して Database ラインナップに加わった Oracle TimesTen In-Memory Database という製品があります。

今年、その TimesTen に無償で利用できる Express Edition がリリースされていることを知りましたので、試しに Oracle Database XE を Cache した際のメモになります。

TimesTen XE の制限事項

TimesTen XE の機能的な制限はライセンスのマニュアルに記載されています。

  • Oracle TimesTen In-Memory Database Licensing Options
    • The maximum value permitted for PermSize is 16 GB. This applies to each TimesTen Classic database and each element in a TimesTen Scaleout database.
    • When deploying as TimesTen Scaleout, the maximum K-safety factor supported is 2.
    • When deploying as TimesTen Scaleout, the maximum number of elements supported is four. You can create a grid and database using k = 1 with four replica sets or a grid and database using k = 2 with two replica sets.
    • Using Oracle Clusterware to manage TimesTen Classic active-standby replication schemes is not supported.
公式ブログのエバンジェリストの方の記事では図もありとてもわかりやすいです。

インストール

TimesTen XE のインストール手順は TimesTen ScaleOut と TimesTen Classic で異なりますが、本記事では TimesTen Classic を扱います。

Oracle Database XE のように RPM パッケージひとつでお手軽にできるようにはなっていませんが、TimesTen 22.1 がベースとなっているため、zip ファイルを展開してインストールスクリプトを実行する構成となっています。
$ unzip timesten221120.xe.server.linux8664.zip
$ tt22.1.1.2.0/bin/ttinstallationcheck
$ tt22.1.1.2.0/bin/ttinstancecreate
インストールスクリプト(ttInstanceCreate)で作成するインスタンスは、設定ファイル以外の多くは zip ファイル展開先(Installation)へのシンボリックリンクとなっています。
$ ll -o $TIMESTEN_HOME/install
total 4
lrwxrwxrwx 1 instanceadmin   35 Dec 20 21:50 3rdparty -> /opt/TimesTen/tt22.1.1.2.0/3rdparty
lrwxrwxrwx 1 instanceadmin   30 Dec 20 21:50 bin -> /opt/TimesTen/tt22.1.1.2.0/bin
lrwxrwxrwx 1 instanceadmin   31 Dec 20 21:50 grid -> /opt/TimesTen/tt22.1.1.2.0/grid
lrwxrwxrwx 1 instanceadmin   34 Dec 20 21:50 include -> /opt/TimesTen/tt22.1.1.2.0/include
lrwxrwxrwx 1 instanceadmin   31 Dec 20 21:50 info -> /opt/TimesTen/tt22.1.1.2.0/info
lrwxrwxrwx 1 instanceadmin   37 Dec 20 21:50 kubernetes -> /opt/TimesTen/tt22.1.1.2.0/kubernetes
drwxr-x--- 2 instanceadmin 4096 Dec 20 21:50 lib
lrwxrwxrwx 1 instanceadmin   34 Dec 20 21:50 network -> /opt/TimesTen/tt22.1.1.2.0/network
lrwxrwxrwx 1 instanceadmin   30 Dec 20 21:50 nls -> /opt/TimesTen/tt22.1.1.2.0/nls
lrwxrwxrwx 1 instanceadmin   40 Dec 20 21:50 oraclescripts -> /opt/TimesTen/tt22.1.1.2.0/oraclescripts
lrwxrwxrwx 1 instanceadmin   31 Dec 20 21:50 PERL -> /opt/TimesTen/tt22.1.1.2.0/PERL
lrwxrwxrwx 1 instanceadmin   32 Dec 20 21:50 plsql -> /opt/TimesTen/tt22.1.1.2.0/plsql
lrwxrwxrwx 1 instanceadmin   38 Dec 20 21:50 README.html -> /opt/TimesTen/tt22.1.1.2.0/README.html
lrwxrwxrwx 1 instanceadmin   34 Dec 20 21:50 startup -> /opt/TimesTen/tt22.1.1.2.0/startup
lrwxrwxrwx 1 instanceadmin   34 Dec 20 21:50 support -> /opt/TimesTen/tt22.1.1.2.0/support
drwxr-x--- 3 instanceadmin   54 Dec 20 21:50 ttoracle_home
$ which ttversion
~/xe/bin/ttversion

$ ll -o ~/xe/bin/ttversion
lrwxrwxrwx 1 instanceadmin 24 Dec 20 21:50 /home/instanceadmin/xe/bin/ttversion -> ../install/bin/ttversion

$ ttversion
TimesTen XE Release 22.1.1.2.0 (64 bit Linux/x86_64) (xe:6624) 2022-05-05T15:26:22Z
  Instance admin: instanceadmin
  Instance home directory: /home/instanceadmin/xe
  Group owner: timesten
  Daemon home directory: /home/instanceadmin/xe/info
  PL/SQL enabled.
$ which sqlplus
~/xe/install/ttoracle_home/instantclient/sqlplus

$ ll -o ~/xe/install/ttoracle_home/instantclient/sqlplus
lrwxrwxrwx 1 instanceadmin 68 Dec 20 21:50 /home/instanceadmin/xe/install/ttoracle_home/instantclient/sqlplus -> /opt/TimesTen/tt22.1.1.2.0/ttoracle_home/instantclient_19_14/sqlplus

$ sqlplus -V

SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.14.0.0.0

キャッシュ作成

データベースの作成やOracle接続関連の設定は省略しますが、Oracle Database XE に rdbms/admin/utlsampl.sql で作成した SCOTT スキーマのいくつかのテーブルをキャッシュするキャッシュグループを作成します。

Command> create readonly cache group scott.scott_cache
       > autorefresh interval 5 seconds
       > from
       > scott.dept
       > (
       >   deptno number(2) not null primary key,
       >   dname varchar2(14),
       >   loc varchar2(13)
       > )
       > unique hash on (deptno) pages = 10
       > ,
       > scott.emp
       > (
       >   empno number(4,0) not null primary key,
       >   ename varchar2(10),
       >   job varchar2(9),
       >   hiredate date,
       >   deptno number(2,0),
       >   foreign key (deptno) references scott.dept (deptno)
       > )
       > unique hash on (empno) pages = 100;
作成したキャッシュグループのステータスを確認。
Command> cachegroups;

Cache Group SCOTT.SCOTT_CACHE:

  Cache Group Type: Read Only
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: Paused
  Autorefresh Interval: 5 Seconds
  Autorefresh Status: ok
  Aging: No aging defined

  Root Table: SCOTT.DEPT
  Table Type: Read Only


  Child Table: SCOTT.EMP
  Table Type: Read Only

1 cache group found.
キャッシュグループへの反映を実行。
Command> load cache group scott_cache commit every 20 rows;
4 cache instances affected.
キャッシュグループに定義した個々のテーブルを確認。
Command> tables;
  SCOTT.DEPT
  SCOTT.EMP
 2 tables found.

Command> desc dept;

Table SCOTT.DEPT:
  Columns:
   *DEPTNO                          NUMBER (2) NOT NULL
    DNAME                           VARCHAR2 (14) INLINE
    LOC                             VARCHAR2 (13) INLINE
  PRIMARY KEY (DEPTNO) HASH INDEX WITH PAGES = 10

1 table found.
(primary key columns are indicated with *)

Command> desc emp;

Table SCOTT.EMP:
  Columns:
   *EMPNO                           NUMBER (4) NOT NULL
    ENAME                           VARCHAR2 (10) INLINE
    JOB                             VARCHAR2 (9) INLINE
    HIREDATE                        DATE
    DEPTNO                          NUMBER (2)
  PRIMARY KEY (EMPNO) HASH INDEX WITH PAGES = 100

1 table found.
(primary key columns are indicated with *)
このあたりは XE とか関係なしに利用できますね。

検索性能

サンプルが SCOTT スキーマなので件数はごく僅かですが、EMP 表の件数を取得するクエリにおける実行計画とその結果を Oracle Database とそれをキャッシュした TimesTen で比較。

SQL> explain plan for select count(*) from scott.emp;

Explained.

Elapsed: 00:00:00.01
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2937609675

-------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |     1 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |        |     1 |            |          |
|   2 |   INDEX FULL SCAN| PK_EMP |    14 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------

9 rows selected.

Elapsed: 00:00:00.03

SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14

Elapsed: 00:00:00.01
Command> explain select count(*) from scott.emp;

Query Optimizer Plan (from Query Compilation):

  STEP:                1
  LEVEL:               1
  OPERATION:           TblLkRangeScan
  TBLNAME:             SCOTT.EMP
  IXNAME:              TTFOREIGN_0
  INDEXED CONDITION:
  NOT INDEXED:
  MISCELLANEOUS:       cardEst = 14


  STEP:                2
  LEVEL:               1
  OPERATION:           OneGroupGroupBy
  TBLNAME:
  IXNAME:
  INDEXED CONDITION:
  NOT INDEXED:
  MISCELLANEOUS:

Execution time (SQLPrepare) = 0.002397 seconds.

Command> select count(*) from scott.emp;
< 14 >
1 row found.
Execution time (SQLExecute + Fetch Loop) = 0.000068 seconds.
0.01 秒が 0.000068 秒となりました。Times Ten どころではないですね。

おわりに

ほんとうは XE でも利用可能な ScaleOut や Kubernetes Operator を試してみたかったのですが、Apache ZooKeeper や Kubernetes など分散ミドルウェアの知識がまったくなかったので、馴染みのある Cache を試してみました。

TimesTen については過去の JPOUG アドベントカレンダーでとても詳しく紹介されていましたね。今回の記事を作成するにあたり、あらためて読み直してみてうなずくばかりでした。

おまけ

TimesTen がサポートするプラットフォームとして、クライアントのみですが macOS にも対応しています。

% ttVersion
TimesTen Release 22.1.1.1.0 (64 bit MacOSX/x86_64) (tt221) 2021-12-06T17:41:29Z
  Instance home directory: /Users/yoshikaw/local/tt221
  Group owner: staff
ODBC 通信のためクライアントのネイティブライブラリは必要ですので、パスを設定すれば SQL Developer からも手軽に参照できます。
% uname -psvr
Darwin 22.2.0 Darwin Kernel Version 22.2.0: Fri Nov 11 02:04:44 PST 2022; root:xnu-8792.61.2~4/RELEASE_ARM64_T8103 arm

% java -version
java version "11.0.11" 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)
% mkdir -pv ~/Library/Java/Extensions
% cd ~/Library/Java/Extensions
% for f in ~/local/tt22.1.1.1.0/lib/*.dylib; do ln -sv $f; done

0 件のコメント:

コメントを投稿