インメモリテーブル/高速化
Oracle
-- Keep the table in memory with Database In-Memory:
ALTER TABLE orders INMEMORY;
-- Memory size (init parameter):
ALTER SYSTEM SET inmemory_size = 4G SCOPE=SPFILE;Oracle Database In-Memory は、頻繁にクエリされるテーブルをメモリ上に列形式で保持することで分析を高速化する(別ライセンス)。OLTP では、バッファキャッシュと KEEP プールも頻繁にアクセスされるブロックをメモリに保持する。インメモリのソリューションはディスク上の行形式によって永続性を維持する。
PostgreSQL
-- Fast table without durability (writes no WAL):
CREATE UNLOGGED TABLE temp_calc (id int, data text);
-- Session-private temporary table (tends to stay in memory):
CREATE TEMP TABLE session_data (id int) ON COMMIT DELETE ROWS;PostgreSQL には専用のインメモリテーブルエンジンがない。UNLOGGED テーブルは WAL の書き込みを省略して書き込みを高速化する(クラッシュ時に内容は失われ、永続性はない)。TEMP テーブルはセッションの間存在し、temp_buffers により可能な限りメモリに保持される。ホットデータは shared_buffers にキャッシュされる。
MySQL
-- Table using the MEMORY (HEAP) storage engine:
CREATE TABLE cache_table (
id INT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=MEMORY;MySQL の MEMORY(旧 HEAP)ストレージエンジンはテーブルデータを完全に RAM に保持する。非常に高速だが、サーバーの再起動でデータは失われる(構造は残る)。BLOB/TEXT をサポートせず、固定の行サイズを使用する。永続的なホットデータには InnoDB バッファプールが推奨される。
SQL Server
-- In-Memory OLTP: memory-optimized table
CREATE TABLE dbo.session_state (
id INT NOT NULL PRIMARY KEY NONCLUSTERED,
data NVARCHAR(100)
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);SQL Server In-Memory OLTP(Hekaton)は、メモリ最適化テーブル(MEMORY_OPTIMIZED=ON)とラッチフリーの構造により高い同時実行性の OLTP を提供する。DURABILITY=SCHEMA_AND_DATA はデータを永続化し、SCHEMA_ONLY はスキーマのみを保持する。メモリ最適化ファイルグループが必要。
MongoDB
-- Hot data is kept in the WiredTiger cache automatically.
-- Set the cache size (default ~50% of RAM):
// mongod --wiredTigerCacheSizeGB 8
// or in the configuration: storage.wiredTiger.engineConfig.cacheSizeGBMongoDB には独立したインメモリテーブルの型がない(旧来の In-Memory Storage Engine は Enterprise 専用で、非推奨になった)。デフォルトの WiredTiger エンジンは、頻繁にアクセスされるデータとインデックスをメモリキャッシュに保持することで読み取り速度を向上させる。OS のファイルキャッシュも寄与する。
Redis
# Redis already runs entirely in memory; nothing extra is needed.
# Persistence and memory policy settings:
CONFIG SET maxmemory 4gb
CONFIG SET maxmemory-policy allkeys-lruRedis はすべてのデータを RAM に保持し、設計上これが速度の源泉となっている。永続化は RDB(スナップショット)と AOF(コマンドログ)のいずれかまたは両方で行う。maxmemory の上限と eviction ポリシー(LRU/LFU/random)が、メモリが満杯になった時の挙動を決める。
Elasticsearch
-- Not applicable: there is no fully in-memory table mode.
# Place hot data on fast nodes with a hot/cold architecture:
PUT sale/_settings
{ "index.routing.allocation.require.data": "hot" }Elasticsearch はデータをディスク(Lucene セグメント)に格納し、専用のインメモリテーブルエンジンは提供しない。速度は OS のファイルキャッシュ(ページキャッシュ)、doc_values、hot-warm-cold アーキテクチャに依存する。十分な RAM とヒープ設定がパフォーマンスにとって重要。