この記事は 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 した際のメモになります。XEでてたんか
— Kazuhiro YOSHIKAWA (@yoshikaw) May 23, 2022
Oracle TimesTen In-Memory Databse Express Edition (XE) Downloads https://t.co/KVqhAp89e6
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 を扱います。
- Prerequisites and Installation of TimesTen Scaleout
- Overview of the Installation Process in TimesTen Classic
$ 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: staffODBC 通信のためクライアントのネイティブライブラリは必要ですので、パスを設定すれば 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 件のコメント:
コメントを投稿