メモリのみで PostgreSQL を実行する

Bilal Shahid 2023年6月20日
  1. インメモリ データベースの概要
  2. メモリ内のデータベースを使用するかどうかにかかわらず、PostgreSQL のサポート
メモリのみで PostgreSQL を実行する

私たちが作成するデータベースは、ハードディスクまたは SSD (ソリッド ステート ドライブ) の永続的なメモリに保存されます。

ただし、このメモリは RAM (ランダム アクセス メモリ) よりも低速です。 そのため、メモリと呼ばれる RAM にデータベースを作成して使用し、より効率的かつ高速にすることがあります。

この記事では、PostgreSQL でメモリ内データベースを使用する方法について説明します。 ただし、最初に、メモリ内でデータベースを実行することの意味と、他のプラットフォームでそれがどのように許可されているかを調べてみましょう。

インメモリ データベースの概要

インメモリ データベース (IMDB) は、ディスク ドライブではなく、コンピュータの RAM またはメイン メモリに格納されて実行されるデータベースです。 これは、メイン メモリからデータを取得するために必要な CPU 命令が少なくなるため、より効率的で高速なパフォーマンスを生成するために行われます。

したがって、このようなデータベースは、迅速な応答時間を必要とするリアルタイム システムやゲーム アプリケーションで主に使用されます。

この速度は、データの変換や暗号化を伴わないため保証されています。 このようにして、データはすぐに使用できる形式で保持されるため、応答時間が短縮されます。

メモリ内のデータベースを使用する場合の欠点の 1つは、RAM が揮発性であることです。 また、RAM は永続的なストレージ ソリューションではないため、電源が遮断されたり、データベースやサーバーがクラッシュしたりすると、データが失われます。

ただし、フラッシュ メモリや不揮発性ランダム アクセス メモリ (NVRAM) などのテクノロジを使用して、インメモリ データベースのこの揮発性に対処しています。 さらに、多くの SQL プラットフォームがインメモリ データベースをサポートしています。

たとえば、SQL Server はインメモリ OLTP を備えているため、メモリ内でのデータベースの実行をサポートしています。 SQL Server では、WITH (MEMORY_OPTIMIZED = ON) または同様のコマンドを作成することで、テーブルをメモリに格納できます。

しかし、注目すべき点は、PostgreSQL でそれを実行できるかということです。 この記事には、この質問に対する回答が含まれています。

メモリ内のデータベースを使用するかどうかにかかわらず、PostgreSQL のサポート

残念ながら、PostgreSQL はメモリ内のデータベースまたはそのコンポーネントの使用をサポートしていません。 主な理由は、PostgreSQL がコンパイル言語である C で実装されていることです。

ただし、メモリ内でデータベースを実行することは有益な性質であり、主に単体テストで結果を高速化するために使用されます。 では、メモリ内データベースのサポートが存在しない場合、開発者は PostgreSQL でこれをどのように行うのでしょうか?

この記事では、いくつかの代替案を見ていきます。 これを行う 1つの方法は、テーブルスペースを作成することです。 これらが何であるか、そしてそれらが良い代替物であるかどうかを見てみましょう.

PostgreSQL で TABLESPACE を使用する

PostgreSQL の tablespace は、作成時にデータベース管理者がその場所を定義できるデータベース オブジェクトです。 tablespace は、データの効率のニーズに応じてメモリ ロケーションを割り当てるのに役立ちます。

たとえば、tablespace を使用して、頻繁にアクセスされるテーブルを SSD などの高速メモリに格納し、必要性の低いデータをハードディスクなどの低速メモリに格納できます。

同様に、tablespace を使用して一部のデータを RAM に保存できるため、メモリ内のデータベースを使用するのと同じ効果が得られます。 表領域を作成するための構文は次のとおりです。

CREATE TABLESPACE tablespace_name LOCATION '/ssd/postgresql/data';

LOCATION キーワードの後に、tablespace を作成するアドレスのシンボリック リンクを追加します。 ただし、PostgreSQL のメモリで tablespaces を使用することはお勧めしません。 公式の PostgreSQL ドキュメントにも警告として追加されています。

RAM の揮発性のため、システム クラッシュや誤った削除によってテーブルスペースが失われると、データベース クラスター内のすべてのデータが読み取れなくなります。 したがって、メモリー内で tablespace を使用することはお勧めできません。

では、どのような選択肢が私たちに残されるのでしょうか? 最初に、検討できる別の代替案を見てみましょう。それは、使い捨ての PostgreSQL インスタンスを作成して応答時間を短縮することです。

使い捨ての PostgreSQL インスタンスを作成する

この方法を理解するために、単体テストの例を考えてみましょう。

データベースのテストには、高速で効率的なパフォーマンス速度が必要です。 PostgreSQL でこれを行う 1つの方法は、使用後に削除される使い捨ての PostgreSQL インスタンスを作成することです。

この方法では、initdb コマンドを使用して PostgreSQL に新しいデータベース クラスターを作成する必要があります。 データベース クラスタは、同じサーバー上で実行されるデータベースのグループです。

initdb コマンドの構文は次のとおりです。

initdb [option...] [ --pgdata | -D ] directory

次のクエリに示すように、このコマンドを使用して新しいデータベース クラスターを作成する方法の例を示します。

initdb --auth=trust --username=postgres -D /path/to/temp/datadir

このコマンドは、一時ストレージ データベース クラスターの作成に役立ちます。 さらに、デフォルトの postgres データベースに trust を付与します。

ここで、上記のクエリで指定されたユーザー postgres として作成されたデータベース クラスターに接続する必要があります。 この後、CREATE USERCREATE DATABASE などの作成コマンドを実行し、コードを単体テストに渡します。

テストが完了したら、pg_ctl コマンドを使用してサーバーを停止し、datadir データ ディレクトリを削除します。 このプロセスにより、メモリ内でデータベースを実行するのと同様に、テスト中の応答時間が短縮されます。

したがって、SQL Server や MySQL とは異なり、PostgreSQL はメモリ内データベースの使用をサポートしていないと結論付けることができます。

RAM 内の場所を指定することでインメモリ テーブルスペース を作成できますが、元に戻すのに多大な労力がかかる可能性がある重大なデータ損失を引き起こす可能性があるため、これはお勧めできません。

テストのために PostgreSQL の応答時間を短縮するために、使い捨ての PostgreSQL インスタンスを作成し、それに応じて構成する場合があります。 これらの概念を明確にしていただければ幸いです。 学び続けます!

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub