インメモリー・データベースの欠点
2022年現在において、1Uサイズの2ソケット・サーバーでも1TBを超える容量のDRAMを搭載できるようになりましたが、複数のシステム・ボードを搭載できるサーバーでも2桁TBが上限です。これに対し不揮発性デバイスであるフラッシュ・メモリー・カードは1枚で数TBあり、ハード・ディスクは1台で10TBの容量があります。1台のストレージ筐体にはこれらのデバイスを複数台搭載できます。ネットワーク接続のストレージならばストレージ筐体の増設も比較的容易です。そのため、フラッシュ・メモリーやハード・ディスクは文字通りDRAMとはけた違いの容量を用意することが可能です。
インメモリー・データベースの低レイテンシかつ高スループットが出せる性質をオンライン・トランザクション処理アプリケーションに適用すると、高スループットで処理できるがゆえに膨大なデータが生成(INSERT)され、データベースのサイズが急速に増大します。しかしデータベースのサイズはDRAMの容量に制限を受けるため、高頻度でデータベースのデータを削除する運用が必要になります。その結果、短期間のデータしかデータベースに保持できないという弊害が生まれます。
そのため、インメモリー・データベースをオンライン・トランザクション処理アプリケーションに使用すると、容量の制限のためにアプリケーションの部分ごとにデータベースを分割することになり、システムのアーキテクチャとしてデータベースが散在する傾向があります。しかしシステム全体としてはデータベース間でデータの整合性がとられている必要があり、システム・インテグレーションの作りこみで対処しようとするとデータベース間の依存関係の数だけ工数が増大します。
また、インメモリー・データベースは起動時にストレージからDRAMに全データを読み込む必要があるため、起動そのものに時間がかかり、それはデータベースのサイズに比例します。索引が指すポインタはメモリー上のアドレスであるため、ストレージ上の表データをメモリーに展開してから索引を構築します。そのためテラバイト単位のインメモリー・データベースを起動するには数10分以上を覚悟する必要があります。これはDBMSがクラッシュしたときの再起動にも時間がかかるということを意味しています。
また、インメモリー・データベースの容量を増やすにはDRAMの容量を増やす必要があります。DRAMの容量を物理的に増設するにはデータベース・サーバーをクラスタ構成にする方法があります。しかしインメモリー・データベースはあらかじめDRAMにデータを読み込んでおくという性質から、クラスタ構成はシェアード・ナッシングのデータの持ち方になります。第3回で説明したように、シェアード・ナッシング・クラスタを使用する場合はデータのパーティショニングの検討が必須であり、プライマリ・キー完全一致指定のクエリーよりも複雑なオンライン・トランザクション処理アプリケーションに適用するには適さない傾向があります。
データベースの全データをインメモリーとして扱うと高速である反面、容量や可用性の面で大きな欠点を持つことになります。そこで、従来からあるキャッシュの仕組みとインメモリーを併用することで、インメモリーの持つ高速性を活かしつつ欠点を補うアーキテクチャを持つDBMSが現れました。
キャッシュとインメモリーの併用
Oracle DatabaseとMySQLはメモリー管理アーキテクチャにキャッシュ型を採用しているDBMSですが、インメモリーを併用する機能が追加されました。Oracle Database In-MemoryとMySQL HeatWaveです。これらはトランザクション系の行指向アクセスには従来からあるキャッシュを使用し、分析・集計系の列指向アクセスにはインメモリーを使用するという使い分けをしています。
Oracle Database In-MemoryもMySQL HeatWaveのどちらも、SQLからアクセス・パターンが行指向か列指向かを自動判断し、キャッシュとインメモリーのどちらを使用するかをアプリケーションから透過的に動作します。第6回で説明したように分析・集計処理は列指向アクセスなのでインメモリー領域に格納された列指向レイアウトのデータにアクセスし、複数のCPUコアで並列化され、さらに1つのCPUコア内でSIMD演算ユニットを使用して並列化されます。クラスタ構成を取ることで複数の物理サーバーにわたっても並列化されます。
これらのDBMSはインメモリーの高速性を活かしつつ、扱えるデータ量に関する欠点をカバーするように考えられています。オンライン・トランザクション処理ではキャッシュに行指向レイアウトで格納されたデータにアクセスします。トランザクションのスループットが膨大でデータ量が急速に増加する場合であっても、キャッシュのアーキテクチャはDRAM容量よりも大きなサイズのデータを扱うことが可能です。分析・集計処理ではインメモリーに列指向レイアウトで格納されたデータにアクセスします。インメモリー領域にはデータベースの全データを載せるのではなく、アクセス対象となるデータが載っていればよくなっており、DRAM容量が小さいことによるデータ・サイズの制限を緩和します。