待望のインメモリーデータベースがOracle Database 12cのオプション機能として登場
最初に発表したのが、待望のインメモリーデータベース機能。これが注目されるきっかけを作ったのは、もちろんSAPのHANAだろう。それを追いかけるようにMicrosoftもSQL Serverの次期バージョンに、インメモリー機能の搭載を発表。IBMもDB2にBLUアクセラレーションという、メモリーを有効に活用するカラム型データベース機能を追加した。
一方Oracleは、TimesTenというインメモリーデータベースを以前から提供している。これはOracle Databaseとは別製品で、Oracle Databaseと連携させ利用することが多い。対して今回発表されたインメモリーデータベース機能は、「Oracle Database 12c In-Memory Option」として提供される。つまり、既存のOracle Databaseの1機能として、インメモリーの高速処理が追加になったのだ。
「クエリーを速くする、100倍は速くなる。同じマシンでも、インメモリーオプションを使えば瞬間的に答えが出てくる」とエリソン氏。このパフォーマンスを、Oracleではデータウェアハウスのような検索処理だけでなく、OLTPの処理でも機能させたいと考えた。
「クエリーのスピードが加速すると、OLTPの処理速度が落ちるようじゃ困る。そうならないやり方を考えた。トランザクションのプロセスも、少なくとも倍以上は速くなる」(エリソン氏)
OLTP用にデータベースを設計すると、行の形でデータを格納する。これは、リレーショナルデータベースが登場して以来ずっと続いている。数行の処理であれば、同時に極めて高速に更新できるのがその特長だ。対して5年ぐらい前から、行ではないやり方を提案する研究者が増えてきた。それがクエリー処理を速くする列の形でのデータ格納方法。これを使うと、レポート作成などはかなり速くなる。
Oracleでは、それよりもベターな方法を考えた。つまり、行も列も両方同時に書き込んだらいいというもの。さらに、その両方をメモリーに入れたのだ。なので、インメモリー・オプションでは、列にデータを挿入すると、行も更新される。その逆も同様で、常に両方のフォーマットを維持する。この方法では、列をインメモリーにしたほうが100倍以上速くなる。さらに、両方を入れるようにすると、クエリーだけでなくOLTPも高速化される。
列ストアーでは、インメモリーに圧縮されて保存される。行はトランザクションのリカバリー用にロールバックされるが、列の場合はそのオーバーヘッドがないのでかなり高速だ。実際にメモリー上の列にデータが入れられると、CPUが16コアあればその1つ1つのコアがメモリー上のデータを並列スキャンする。この並列処理は、CPUの中でベクトル指示で行われ、複数の値を同時にスキャンするので「ものすごく高速だ」とエリソン氏。単一の列だけでなく、複数のテーブルをジョインするような複雑なクエリーでもかなりの高速化が図られる。