Oracle Database 12cリリース12.1.0.2の新パフォーマンスチューニング機能:パート2
本記事はTriCoreにより2017年4月12日に公開されたものです。
この全2回のブログシリーズでは、Oracle® Databaseの新しいパフォーマンスチューニング機能について解説します。パート1ではOracle Databaseバージョン12.1.0.1を取り上げましたが、今回は続編としてバージョン12.1.0.2で追加された機能に焦点を当てます。
インメモリ・カラムストア(IM列ストア)とは
インメモリ・カラムストア(IM列ストア)は、システムグローバル領域(SGA)内に設置できるオプション領域です。表、パーティション、その他のデータベースオブジェクトのコピーを、高速スキャンに最適化されたカラムナ形式(列指向形式)で格納します。IM列ストアを活用することで、分析処理、データウェアハウス、オンライントランザクション処理(OLTP)アプリケーションのデータベースパフォーマンスを大幅に向上させることができます。
IM列ストアの仕組み
IM列ストアはデータベースオブジェクトのコピーをSGA内に保持しますが、データベースバッファキャッシュを置き換えるものではありません。両方のメモリ領域は、同じデータを異なる形式で格納できます。IM列ストアに格納された行は、大きなメモリ領域に分割され、カラムナ形式で配置されます。各領域内では、各カラム(列)が連続したメモリ領域に個別に配置されるのが特徴です。
IM列ストアは、以下のデータベースオブジェクトに対して有効化できます。
- 表
- マテリアライズド・ビュー
- パーティション
- 表領域
表のすべてのカラムをIM列ストアに格納することも、一部のカラムだけを格納することも可能です。同様に、パーティション表の場合も、すべてのパーティションを対象にするか、一部のパーティションのみを対象にするかを選択できます。表領域レベルでIM列ストアを有効化すると、Oracle Databaseはその表領域内のすべての表およびマテリアライズド・ビューに対して自動的にIM列ストアを有効化します。
IM列ストアを使用するパフォーマンス上のメリット
データベースオブジェクトをディスクではなくメモリに格納することで、Oracle Databaseはスキャン、クエリ、結合、集計をはるかに高速に実行できるようになります。IM列ストアは、以下のようなタスクでパフォーマンスを向上させます。
- 大量の行をスキャンし、フィルタを適用する場合
- 多数のカラムの中から少数のカラムのみを照会する場合
- 小さな表と大きな表を結合する場合(特に結合条件によって大部分の行が除外されるケース)
- クエリ内でデータを集計する場合
さらに、IM列ストアはDML(データ操作言語)文のパフォーマンスも向上させます。OLTPシステムでは、アクセス頻度の高いカラムに対して多数の索引を作成するのが一般的ですが、これらの索引はDML文のパフォーマンスに悪影響を及ぼすことがあります。データベースオブジェクトをIM列ストアに格納すれば、スキャンが大幅に高速化されるため、こうした索引が不要になります。不要な索引を削減できれば、更新が必要な索引が少なくなり、結果としてDML文のパフォーマンスが向上します。

画像出典:Oracle Learning Library YouTube動画「Oracle Database 12c demos: In-Memory Column Store Architecture Overview」
IM列ストアに必要なサイズの見積もり
IM列ストアでは、以下の圧縮方式がサポートされています。
| 圧縮方式 | インメモリデータの圧縮順序 | インメモリデータの圧縮率比較 |
|---|---|---|
| NO MEMCOMPRESS | 1 | NIL |
| MEMCOMPRESS FOR DML | 2(最も低い圧縮率) | B<all |
| MEMCOMPRESS FOR QUERY LOW | 3 | B<C<D |
| MEMCOMPRESS FOR QUERY HIGH | 4 | C<D<E |
| MEMCOMPRESS FOR CAPACITY LOW | 5 | D<E<F |
| MEMCOMPRESS FOR CAPACITY HIGH | 6(最も高い圧縮率) | all<F |
次の例は、oe.product_information表に対してIM列ストアを有効化し、圧縮方式としてMEMCOMPRESS FOR CAPACITY HIGHを指定する方法を示しています。
SQL>ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;
IM列ストアのサイズ設定
IM列ストアにデータベースオブジェクトを格納するために必要なメモリ量を把握したら、初期化パラメータINMEMORY_SIZEを使用してサイズを設定します。
以下の手順でIM列ストアのサイズを設定してください。
-
初期化パラメータ
INMEMORY_SIZEに必要なサイズを設定します。このパラメータのデフォルト値は
0であり、これはIM列ストアが使用されないことを意味します。IM列ストアを有効化するには、ゼロ以外の値を設定してください。マルチテナント環境では、PDB(プラガブル・データベース)ごとにこのパラメータを設定することで、PDB単位のIM列ストアサイズを指定できます。各PDBの値の合計は、CDB(コンテナ・データベース)の値と一致している必要はなく、それを超えても構いません。
-
IM列ストアのサイズを設定した後は、データベースオブジェクトを格納できるようにするために、データベースインスタンスの再起動が必要です。
次の例は、IM列ストアのサイズを100GBに設定する方法を示しています。
ALTER SYSTEM SET INMEMORY_SIZE = 100G;
IM列ストアの管理性サポート
SQLモニター・レポート、アクティブ・セッション履歴(ASH)レポート、自動ワークロード・リポジトリ(AWR)レポートには、さまざまなインメモリ操作に関する統計情報が表示されるようになりました。これにより、IM列ストアの動作状況を容易に監視・分析できます。
データベースキャッシングモード
データベースのキャッシングモードには、次の2種類があります。
- 以前のバージョンのOracle Databaseでも使用されているデフォルトのデータベースキャッシングモード
- Oracle Database 12cリリース1(12.1.0.2)で新たに導入されたフォース・フル・データベース・キャッシングモード
デフォルトのデータベースキャッシングモード
デフォルトでは、Oracle Databaseは全表スキャンを実行する際にデフォルトのデータベースキャッシングモードを使用します。
Oracle Databaseインスタンスは、バッファキャッシュにデータベース全体をキャッシュする十分なスペースがあり、かつそれが有益であると判断した場合、データベース全体を自動的にバッファキャッシュにキャッシュします。
一方、バッファキャッシュにデータベース全体をキャッシュする十分なスペースがないと判断した場合は、以下のように動作します。
- バッファキャッシュサイズの2%未満の小規模な表:これらの表をメモリにロードします。
- 中規模の表:前回の表スキャンからバッファキャッシュのエージング・タイムスタンプまでの間隔を分析します。前回の表スキャンで再利用された表のサイズが残りのバッファキャッシュサイズより大きい場合、その表をキャッシュします。
- 大規模な表:
KEEPバッファプール用に明示的に宣言されていない限り、メモリにロードしません。
フォース・フル・データベース・キャッシングモード
フォース・フル・データベース・キャッシングモードを使用すると、データベース全体をメモリにキャッシュできます。これにより、全表スキャンやラージオブジェクト(LOB)へのアクセス時に、大幅なパフォーマンス向上が期待できます。
デフォルトのキャッシングモードでは、ユーザーが大きな表を照会しても、基盤となるデータが常にキャッシュされるとは限りません。一方、フォース・フル・データベース・キャッシングモードでは、Oracle Databaseはバッファキャッシュがデータベース全体をキャッシュするのに十分な大きさであると想定し、クエリがアクセスするすべてのブロックをキャッシュしようとします。データベースのサイズがデータベースバッファキャッシュのサイズより小さい場合、この動作は成功します。
Oracle Databaseは、アクセスされたすべてのデータファイルをバッファキャッシュにロードします。これには、NOCACHE LOBやSecureFilesを使用するLOBも含まれます。

画像出典:Full DB In-Memory Caching
フォース・フル・データベース・キャッシングモードを使用すべき状況
以下のような状況では、フォース・フル・データベース・キャッシングモードの使用を検討してください。
- 論理データベースサイズ(または実際の使用領域)が、Oracle Real Application Clusters(RAC)環境における各データベースインスタンスの個別バッファキャッシュよりも小さい場合。この推奨事項は、Oracle RAC以外のデータベースにも適用されます。
- Oracle RAC環境において、インスタンスごとのアクセスで適切に分割されたワークロードの場合、論理データベースサイズがすべてのデータベースインスタンスのバッファキャッシュ合計サイズの80%未満である場合。
- データベースが
SGA_TARGETまたはMEMORY_TARGETを使用している場合。 NOCACHELOBをキャッシュする必要がある場合。NOCACHELOBは、フォース・フル・データベース・キャッシングを使用しない限りキャッシュされません。
最初の3つの状況では、パフォーマンス指標が期待どおりであることを確認するために、システムパフォーマンスを定期的に監視することをお勧めします。
注意:あるOracle RACデータベースインスタンスでフォース・フル・データベース・キャッシングモードを使用すると、そのOracle RAC環境内の他のすべてのデータベースインスタンスもこのモードを使用することになります。また、マルチテナント環境では、フォース・フル・データベース・キャッシングモードはすべてのPDBを含むCDB全体に適用されます。
データベースキャッシングモードの設定と確認
まず、データベースとメモリのサイズを確認します。次の例のように、SYSAUX表領域は除外してかまいません。
SQL> col size_mb format 9999
SQL> SELECT sum(bytes)/1024/1024 seg_size_mb FROM dba_segments where tablespace_name != 'SYSAUX';
SEG_SIZE_MB
-----------
4971
次のコマンドでバッファキャッシュのサイズを確認します。
SQL> SELECT round(sum(cnum_set * blk_size)/1024/1024) size_mb FROM X$KCBWDS;
SIZE_MB
-------
5283
以下の手順で、フォース・フル・データベース・キャッシング用にデータベースを構成します。
SQL> startup mount;
Database mounted.
SQL> ALTER DATABASE FORCE FULL DATABASE CACHING;
Database altered.
SQL> SELECT force_full_db_caching FROM v$database;
FOR
---
YES
SQL> alter database open;
Database altered.
フォース・フル・データベース・キャッシングモードが有効になっているかどうかは、以下の手順で確認できます。
-
次のコマンドで
V$DATABASEビューを照会します。SQL>SELECT FORCE_FULL_DB_CACHING FROM V$DATABASE;出力は
YESまたはNOのいずれかです。 -
フォース・フル・データベース・キャッシングモードを有効化するには、次の
ALTER DATABASEコマンドを使用します。ALTER DATABASE FORCE FULL DATABASE CACHING;コマンドを実行すると、次の確認メッセージが返されます。
Database altered. -
フォース・フル・データベース・キャッシングを無効化するには、次のコマンドを使用します。
SQL> ALTER DATABASE NO FORCE FULL DATABASE CACHING;コマンドを実行すると、次の確認メッセージが返されます。
Database altered.
まとめ
まとめると、IM列ストアはDML文の実行時間を短縮し、フォース・フル・データベース・キャッシングモードは顕著なパフォーマンス向上をもたらします。Oracle Databaseの新しいパフォーマンスチューニング機能の詳細については、Oracle Enterprise Manager(OEM)が提供するレポートもぜひご確認ください。
コメントやご質問がある場合は、フィードバックタブをご利用ください。
参考文献
本記事の執筆にあたり、以下の資料を参考にしました。
- Database Performance Tuning Guide: Performance Benefits of Using the In-Memory Column Store
- Full DB In-Memory Caching
- Oracle Database 12c demos: In-Memory Column Store Architecture Overview
-
Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説
Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。 本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。 1. 無限Range(Endless Range) Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。 新しい無限Rangeは次のように書きます。 (1..) 通常のRangeが(1..10)のように終端
-
iOS 11で生まれ変わったApp Store、注目の新機能5選
iOS 11の目玉機能のひとつが、全面リニューアルされたApp Storeです。Appleはインターフェースの再設計において、数々の注目すべき変更を加えました。過去9年間ほとんど変わることのなかったApp Storeが、これほど大きな変更を遂げたのは今回が初めてのことです。 新しいApp Storeには語り尽くせないほど多くの要素が詰まっています。残念ながら「ウィッシュリスト」機能は削除されましたが、その分、まったく新しい体験があなたを待っています。ここではポジティブな面にフォーカスし、ユニークな機能を詳しく見ていきましょう。 1. 全新デザインの「Today」セクション まず最初に目を引