さて、今回はRDBMSの「テーブル結合」と「集計処理」の2つをNoSQLデータベースで実現する手段として、事前作り置きのデータ構造(キャッシュテーブル)を参照する方法を紹介しました。ただ、「集計結果を事前に計算しておく」という方法自体はNoSQLデータベースに特有のノウハウではありません。テーブルの結合や集計処理はRDBMSであっても負荷の高い処理なので、読者の中には「パフォーマンス対策として」RDBMS内にキャッシュテーブルを作るというテクニックを実践したことのある方もいるのではないかと思います。
キャッシュテーブルを利用したデータアクセスでは、負荷の高いテーブル結合や集計処理を省略してデータを読み取れるため、データの読み取り速度を上げることが可能です。しかし、この方法は本来RDBMSの長所であるはずの「データ整合性の確保」という特性を犠牲にしており、いくつかのデメリットがあることを忘れてはいけません。このデメリットについてはNoSQLデータベースの場合も同じことが言えます。ここでは、キャッシュテーブルの使い方について2つ、気を付けたいポイントを説明します。
まず、当たり前の話ですが、キャッシュテーブルのデータは最新であるとは限りません。データはあくまで「データを作成した時点での」結果であるため、キャッシュテーブルのデータが有効かどうかを判断する材料として「データがいつ作られたのか」という情報が重要になります。
キャッシュテーブルを設計するときは追加項目として、タイムスタンプ(データの作成日時)も入れておくことをお勧めします。また、アプリケーション側で結果を表示する場合も「○○時点の結果です」あるいは「最新の結果が反映されるまでには、しばらく時間がかかることがあります」のようなメッセージを併記することで、必ずしも最新の結果を表示しているわけではないことをユーザーに納得してもらう必要があります。
次に気をつけるべきポイントは、キャッシュされたデータがどのくらいの周期で更新(変更)されるかということです。例えば「先月の売上」のようなタイプの集計結果は一度計算してしまえば(入力ミスでも発覚しない限り)再計算の必要はありませんが、「直近1時間以内にどれくらいのアクセスがあったか」というタイプの集計結果は、再計算するたびに結果は変わっていくはずです。再計算のたびに結果が変わるようなキャッシュテーブルは、いつまでも古いデータを使うわけにはいかないので、定期的にデータを更新していく必要があります。更新の周期はデータの用途によって異なりますが、先ほど説明したようにキャッシュデータにタイムスタンプを持たせておくことで、キャッシュの有効期限チェックや、定期的なデータ更新処理を追加できるようになります。
今回は、RDBMSのテーブル結合と集計処理を実現するための手段として、キャッシュテーブルを活用する方法を紹介しましたが、キャッシュテーブルは万能の解決策ではないことについても説明しました。キャッシュテーブルを運用していくには、テーブルのデータを適切なタイミングで更新していく必要があります。次回は、NoSQLデータベースの更新処理について説明していきます。
株式会社システムインテグレータ
渡辺俊史
製品企画本部 製品開発グループ
Copyright © ITmedia, Inc. All Rights Reserved.