読者です 読者をやめる 読者になる 読者になる

Oracle 11g 新機能 virtual仮想列と結果キャッシュ

新機能のvirtual仮想列について。

virtual仮想列

式を指定して仮想列を定義する事が可能。

create table test (
  c1 number,
  c2 number,
  c3 as (c1 + c2) virtual
)

virtualキーワードを指定することにより、c3カラムはc1とc2が加算された値が自動的に移入されます。

注意したいのは、仮想列にはinesrt/update操作が許されていないところです。

SQL> insert into test(c1, c2, c3) values (1, 2, 3);
insert into test(c1, c2, c3) values (1, 2, 3);
            *
行1でエラーが発生しました。:
ORA-54013: 仮想列ではINSERT操作は許可されていません


virtual仮想列には索引の作成も可能です。

SQL> create index test_index on test(c3)
索引が作成されたました。


もう一つ注意したいのがメタ情報です。
desc testとしても、仮想列の型はtestテーブルの場合、numberと表示されます。
virtual仮想列をJDBCのDatabaseMetaDataで検索した場合も

DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getColumns(null, "SCOTT", "TEST", "");
rs.next();
System.out.println(rs.getString("TYPE_NAME"));

この場合もNUMBERとなります。

virtual仮想列を文字列型に変更した場合は、もちろんVARCHAR2になります。

alter table test modify (c3 as (c1 + c2 || 'TIMES') virtual);

ですので、例えばメタ情報からEntityを作成しそのEntityを使って
S2Daoでinsert/updateする場合エラーが起こる可能性があります。

結果キャッシュ

クエリ結果を保存する領域があり、結果キャッシュに値が残っている場合は
クエリを実行せずに結果キャッシュから値を取り出すようです。

結果キャッシュへの設定値は以下の通りです。

初期化パラメータ デフォルト値
client_result_cache_lag 3000
client_result_cache_size 0
result_cache_max_result 5
result_cache_max_size 1280K
result_cache_mode MANUAL
result_cache_remote_expiration 0
select /*+ result_cache */ from person;

メモリ管理モード

ちょっと補足でメモリ管理モードは以下の通りです。
自動メモリ管理を有効化しない場合は、SGAおよびPGAのそれぞれに対して個別にメモリ管理を構成する必要があるようです。

メモリー管理モード 対象 設定項目 Oracle Databaseにより自動チューニングされる項目
自動メモリー管理 SGAおよびPGA Oracleインスタンスの合計メモリー・ターゲット・サイズ
・(オプション)Oracleインスタンスの最大メモリー・サイズ
・合計SGAサイズ
・SGAコンポーネント・サイズ
インスタンスPGAサイズ
・個々のPGAサイズ
自動共有メモリー管理
(自動メモリー管理は無効化)
SGA ・SGAのターゲット・サイズ
・(オプション)SGAの最大サイズ
・SGAコンポーネント・サイズ
手動共有メモリー管理
(自動メモリー管理および自動共有メモリー管理は無効化)
SGA ・共有プール・サイズ
・バッファ・キャッシュ・サイズ
Javaプール・サイズ
・ラージ・プール・サイズ
-
自動PGAメモリー管理 PGA インスタンスPGAのターゲット・サイズ 個々のPGAサイズ
手動PGAメモリー管理
(非推奨)
PGA SQL演算子の各タイプに対する作業領域の最大サイズ -

なんだからたくさんありすぎておなかいっぱいです。
ちなみに基本的なメモリ領域は

領域 概要
ソフトウェア・コード領域 実行中または実行される可能性があるコードを格納するためのメモリー部分です。
Oracle Databaseのコードはソフトウェア領域に格納されます。
この場所は通常ユーザー・プログラムの格納場所とは異なり、排他的であるかまたは保護されています。
システム・グローバル領域(SGA) SGAは、SGAコンポーネントと呼ばれる共有メモリー構造のグループで、
1つのOracle Databaseインスタンスに関するデータと制御情報が保存されています。
SGAは、すべてのサーバーおよびバックグラウンド・プロセスで共有されます。
SGAに保存されるデータの例としては、キャッシュ・データ・ブロックや共有SQL領域があります。
プログラム・グローバル領域(PGA PGAは、サーバー・プロセス用のデータや制御情報を含むメモリー領域です。
PGAは、サーバー・プロセスの起動時に、Oracle Databaseによって作成される非共有メモリーです。
PGAにアクセスできるのはサーバー・プロセスのみです。
各サーバー・プロセスにはPGAが1つあります。
バックグラウンド・プロセスにも独自のPGAが割り当てられます。
すべての個々のPGAで使用されるメモリーの合計は、合計インスタンスPGAメモリーと呼ばれ、
個々のPGAの集合は、合計インスタンスPGA、または単にインスタンスPGAと呼ばれます。
個々のPGAではなく、データベース初期化パラメータを使用してインスタンスPGAのサイズを設定します。

おなかいっぱいいっぱいですね。

まとめ

他にもいろいろありますが目に付いた機能を紹介してみました。
詳しくは http://www.oracle.com/pls/db111/homepage