Oracle Database 12c R1 12.1.0.2.0 In-memory option はじめの一歩。 Tweet
こまけーことは置いといて、
Oracle Database 12c R1 12.1.0.2.0 In-memory optionが利用できるようになったので簡単に試してみた。
環境は以下の通り
Oracle VM VirtualBox 4.3.12 for OS X
Oracle Linux 6.4
Oracle Database 12c EE 12.1.0.2.0 for Linux x86-64
時間が無かったので、マニュアルを斜め読みしつつ、とにかくインストール....
inmemory系初期化パラメータの確認。 (12.1.0.1と12.1.0.2の初期化パラメータの差分確認はあとで:TODO)
inmemory_sizeパラメータが0なのでin-memory column storeは機能しない状態がデフォルトなのか..
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SYS>
SYS> show parameter inmemory
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 0
inmemory_query string ENABLE
inmemory_size big integer 0
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
SYS>
以下の表を作成してあります。 10万行のうちb='1'である行は10行だけにしてあります。
SCOTT> desc foobar
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B CHAR(1)
SCOTT> select count(1) from foobar;
COUNT(1)
----------
100000
今まで通りに表を作成すると、in-memory column storeはdisabledで作成されるのか! ふむふむ。
SCOTT> select table_name,inmemory from user_tables where table_name='FOOBAR';
TABLE_NAME INMEMORY
------------------------------ --------
FOOBAR DISABLED
索引は作成していないので以下のようなクエリを実行すれば、TABLE ACCESS FULLですよね。
SCOTT> select /*+ gather_plan_statistics */ count(1) from foobar where b = '1';
COUNT(1)
----------
10
SCOTT> @show_actual_plan
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
SQL_ID 4zurd70pg2qna, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ count(1) from foobar where b = '1'
Plan hash value: 2479556450
---------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 191 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 191 |
|* 2 | TABLE ACCESS FULL| FOOBAR | 1 | 15 | 10 |00:00:00.01 | 191 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"='1')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
23行が選択されました。
in-memory column storeを利用するための準備〜〜〜。
alter table文でin-memory column storeを有効化。(簡単だな!)
SCOTT> alter table foobar inmemory;
表が変更されました。
おっと、忘れてました、 inmemory_sizeパラメータを設定しないといけないんだった...
ちなみに、inmemory_sizeパラメータは静的パラメータなので、scope=spfileを付けることをお忘れなく...
SYS> alter system set inmemory_size = 10m;
alter system set inmemory_size = 10m
*
行1でエラーが発生しました。:
ORA-02097: 指定した値が無効なので、パラメータを変更できません。 ORA-02095:
指定した初期化パラメータを変更できません。
メモリ関係のパラメータ変えて起動しなくなるって過去やらかしたことがあるので、手が勝ってに動くw
SYS> create pfile from spfile;
ファイルが作成されました。
変更できたました。
SYS> alter system set inmemory_size = 10m scope=spfile;
システムが変更されました。
SYS>
....中略....
起動してみましょう! あらららら。
SYS> startup
ORA-64353: in-memory area size cannot be less than 100MB
ううううう、なんということでしょう! w このパラメータ間違うと起動しないのな!!!!! 注意しないと。 > 俺
in-memory初期化パラメータは 100MB以上に設定しましょうね。マニュアルにも書いてますから。(読みましょうね。 (^^;;;;
気を取り直して、再チャレンジ :)
[oracle@emperor ˜]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on 火 7月 29 06:34:46 2014
Copyright (c) 1982, 2014, Oracle. All rights reserved.
アイドル・インスタンスに接続しました。
SYS> create spfile from pfile;
ファイルが作成されました。
SYS> startup
ORACLEインスタンスが起動しました。
Total System Global Area 3875536896 bytes
Fixed Size 3717856 bytes
Variable Size 2248148256 bytes
Database Buffers 1610612736 bytes
Redo Buffers 13058048 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS> alter system set inmemory_size = 100m scope=spfile;
システムが変更されました。
SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS> startup
ORACLEインスタンスが起動しました。
Total System Global Area 3875536896 bytes
Fixed Size 3717856 bytes
Variable Size 2231371040 bytes
Database Buffers 1509949440 bytes
Redo Buffers 13058048 bytes
In-Memory Area 117440512 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS>
SYS>
In-Memory Areaとリストされています。
うまくいったようなので in-memory column storeを試してみます!!!!
SCOTT> select /*+ gather_plan_statistics */ count(1) from foobar where b = '1';
COUNT(1)
----------
10
SCOTT>
SCOTT>
SCOTT> @show_actual_plan
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------
SQL_ID 4zurd70pg2qna, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ count(1) from foobar where b = '1'
Plan hash value: 2479556450
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 8 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 8 |
|* 2 | TABLE ACCESS INMEMORY FULL| FOOBAR | 1 | 15 | 10 |00:00:00.01 | 8 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - inmemory("B"='1')
filter("B"='1')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
24行が選択されました。
in-memory column storeを利用しない場合、Buffer Getsが191ありましたが、in-memory column storeを利用した場合、Buffer Getsが8と大幅に減少しています!!!。データにもよるだろうけど、このケースだと、4%程度になってますね。
KEEP乗せとか手動でやらなくて済むケースあるんだろうな〜と、遠くを眺めながら.......in-memory column store初めの一歩はここまで。
つづく。
| 固定リンク | 0
コメント