SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド

キャッシュかインメモリーか? DBMSのメモリー管理アーキテクチャの違いと使い分け

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド 第7回

DRAMにデータをキャッシュする

 2022年時点のサーバーは1Uサイズの筐体でもDRAMの搭載容量が1TBを超えるものがあります。しかしインターネットが普及し始めた20世紀末のサーバーはまだDRAMの搭載容量の単位がメガバイト(MB)やギガバイト(GB)でした。データベースで扱いたいデータの容量は1台のサーバーが搭載できるDRAM容量よりもはるかに大きいため、データベースの全データをDRAMに格納することはできませんでした。そこで、データベースの全データ容量よりも小さいけれども高速なDRAMを使用して高速化する手法としてDBMSにもキャッシュ・メモリーの概念が使用されました。

 データへのアクセスの性質には、あるデータにアクセスしたら近い時間のうちにまたアクセスされやすいという時間的局所参照性と、あるデータにアクセスしたらそれに近いアドレスにあるデータにもアクセスされやすいという空間的局所参照性があります。キャッシュ・メモリーの概念は、低速なストレージの一部分の連続領域ブロックを高速なメモリーに格納しておけば、高速なメモリー上のデータにアクセスされたら再びメモリー上のデータにアクセスされる確率が高いという性質を利用して平均アクセス時間を減少させる技法です。キャッシュ・ミスした場合は、あまりアクセスされていないデータ・ブロックをキャッシュ・メモリーから追い出し、ストレージから読み取ったデータ・ブロックをキャッシュ・メモリーに乗せます。

データをデータ・ブロックの単位に分割してメモリーに格納するキャッシュ
データをデータ・ブロックの単位に分割してメモリーに格納するキャッシュ

 DBMSでのキャッシュ・メモリーの概念は、ストレージ上のデータベースのサイズがDRAMのメモリー容量よりも大きくても動作できるという利点があります。しかし、該当データ・ブロックがメモリー上にキャッシュされているかを判定し、キャッシュされていなければストレージから読み取ってメモリーに載せる処理もCPUによるソフトウェア処理です。索引が指すポインタはデータ・ブロック上のアドレスであり、つまりはストレージ上のアドレスです。これをメモリー上のアドレスに変換する一種の仮想アドレス変換のソフトウェア処理が入ります。

インメモリー・データベース

 21世紀になり1台のサーバーに搭載できるDRAMの容量が100GBを超えるようになってきたころ、ストレージ上の全データをあらかじめDRAMのメモリーに格納し、ソフトウェアによるキャッシュ置換処理を省略することで高速化するインメモリー・データベースが登場しました。Oracle TimesTen In-Memory DatabaseやSAP HANAがインメモリー・データベースに該当します。

 Oracle TimesTen In-Memory Databaseはオンライン・トランザクション系処理で使用されるような1つのSQLが少量のデータにアクセスするパターンを得意としており、1つのSQLのデータベース・サーバー内での処理時間が1桁μ秒のオーダー[*1]です。

[*1] これはOracle Databaseの1/10の時間であり、TimesTen(10倍)の名前の由来です。

 キャッシュ・アーキテクチャでは索引が指すポインタはストレージ上のデータ・ブロックのアドレスであり、データ・ブロックにアクセスするたびにそれがメモリー上のどこにキャッシュされているかの探索をソフトウェアで処理します。これに対しインメモリー・アーキテクチャであるOracle TimesTen In-Memory Databaseの索引が指すポインタは表データ本体が存在するメモリーのアドレスです。そのためキャッシュでは必要だったデータ・ブロックがメモリーのどこに存在するかの一種の仮想アドレス変換のソフトウェア処理を省略することができます。

あらかじめ全データをメモリーに格納するインメモリー
あらかじめ全データをメモリーに格納するインメモリー

 データベース・サーバー内の処理時間が極めて短いことは望ましい性質です。しかしこの性質を使いこなすにはシステム設計やアプリケーションのコーディングで細心の注意が必要です。一般的に、アプリケーション・サーバーとデータベース・サーバーは異なる物理サーバーであり、イーサネットで接続されています。しかし通信1往復にかかる時間は、ユーザー空間のプロセスからOSカーネルのコンテキスト・スイッチ時間なども含めると、pingコマンドの応答時間は100μ秒以上を示すようになります。そのため、アプリケーションの1つの処理がネットワーク越しのデータベース・サーバーに何回もアクセスするようになっていると、インメモリー・データベースの低レイテンシを活かすことができません。そのため、Oracle TimesTen In-Memory Databaseはアプリケーション・サーバーのプロセスと同一OS上で動作させることも想定しています。

 第1回でも説明しましたが、複数件のデータを取得するために、1件を取得するたびに1回データベースにアクセスを発行するのをループで回すようなコードを記述していると、ネットワーク越しのアクセス回数が増大します。SELECT文で複数のデータの集合を取得するように記述すると、複数のデータの集合(結果集合、Result Set)をバースト転送するようになっています。

次のページ
インメモリー・データベースの欠点

この記事は参考になりましたか?

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド連載記事一覧

もっと読む

この記事の著者

日下部 明(日本オラクル株式会社)(クサカベ アキラ)

 日本オラクル株式会社でOracle Databaseを担当するエンジニア。主にOracle Real Application Clustersを中心とする高可用性構成や性能チューニングの問題解決およびコンサルティングに従事。著書に「これは使えるOracle新機能活用術」(翔泳社)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/15804 2022/04/18 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー