
SingleStore Universal Storage は、データベースの動作方法に関する新しいビジョンです。現在の行ストア テーブルと列ストア テーブルの違いは最初はあいまいになり、その後、ほとんどのユース ケースで完全になくなります。SingleStore Universal Storage™ Phase 1 は、SingleStoreDB Self-Managed 7.0 (現在ベータ版) の一部として出荷され、行ストア テーブルで NULL 圧縮が可能になり、多くの場合 TCO が 50% 削減されます。列ストア テーブルでは、高速なシークと更新をサポートするシーク可能な列ストアが実現され、行ストア テーブルのパフォーマンスとユーザビリティに関する多くの機能が列ストア テーブルに提供されます。開発者がこれまで行ストア テーブルと列ストア テーブルの中間、または行ストア データベース ソフトウェアと列ストア データベース ソフトウェアを別々に提供するという難しい選択に直面していた状況が大幅に軽減され、コストが削減され、パフォーマンスが向上します。SingleStoreDB Self-Managed 7.0 で提供される新しい System of Record の改善により、「1 つのデータベースですべてを管理する」というビジョンが実現し始めます。
これは、SingleStore独自の特許取得済みUniversal Storage機能について説明する4部構成の記事の第1回です。全容をご理解いただくには、シリーズの第2部、第3部、第4部をお読みください。
SingleStore Universal Storageのご紹介
SingleStore Universal Storageは、データベースストレージアーキテクチャにおける画期的な技術であり、運用ワークロードと分析ワークロードを単一のテーブルタイプで処理することを可能にします。これにより、開発者の作業が簡素化されるとともに、優れたスケーラビリティとパフォーマンスが実現し、コストも最小限に抑えられます。
SingleStoreDB Self-Managed 7.0 の重要な第一歩として、Universal Storage Phase 1 では、OLTP アプリケーションが列ストアテーブルを使用して、RAM をはるかに超えるデータに対して運用トランザクションを実行できるようになります。これは、新しいハッシュインデックスと、ディスクベースの列ストアテーブルにおける関連する速度および同時実行性の向上によってサポートされ、インメモリ速度でのシークと更新を実現します。Universal Storage Phase 1 では、高速なメモリベースの行ストアテーブルにおける null 値のインメモリ圧縮により、大規模なデータセットに対するトランザクションアプリケーションをより経済的にサポートするようになりました。これにより、多くのユースケースで約 50% のメモリ節約が実現します。
これらの改善により、SingleStore のお客様は、低コストで優れたパフォーマンス、コンピューティング リソースを最大限に活用する柔軟性、そして最大のデータ管理問題に経済的に取り組む能力を獲得できます。
究極のテーブルフォーマットのビジョン
SingleStoreは、同一データベース内で2種類のデータテーブルをサポートします。1つはインメモリ行ストアで、オンライントランザクション処理(OLTP)およびハイブリッドトランザクション/分析(HTAP)アプリケーションに最適です。もう1つはディスクベースの列ストアで、純粋に分析のみを行うアプリケーションに最適です。お客様は、OLTPおよびHTAPにおける行ストアの速度と予測可能性を高く評価しています。また、列ストアの驚異的な分析パフォーマンスと、RAMに経済的に収まる量をはるかに超えるデータを保存できる能力も高く評価されています。
しかし、お客様からは、行ストアの総所有コスト(TCO)の改善を求められています。これは、テーブルが大きくなると大量の RAM を搭載したサーバーをプロビジョニングする必要があり、コストがかかる可能性があるためです。また、高速 UPSERTS や一意制約など、OLTP のような機能を列ストアに追加するよう求められています。これに対し、私たちは、1 つのテーブル タイプを、利用可能な RAM をはるかに超える任意の大規模なデータセットの OLTP、HTAP、分析に使用でき、パフォーマンスと TCO をすべて最適化できるという将来ビジョンを開発しました。私たちはこれをSingleStore Universal Storageと呼んでいます。
Universal Storageの最終的な目標は、明示的に定義された行ストアテーブルに必要なRAM容量が利用可能であれば、OLTPとHTAPのパフォーマンスが行ストアテーブルと同等になること、そして利用可能なRAM容量がそれよりも少ない場合でもOLTPのパフォーマンスが適切に低下することです。大規模なスキャン、結合、集計などを利用する分析においては、列ストアテーブルと同等のパフォーマンスを提供することが目標です。
RAMよりも大きなテーブルでOLTPをサポートする従来の方法は、Bツリーのようなレガシーストレージ構造を使用することです。しかし、これはパフォーマンスの大幅な低下につながる可能性があり、改善が必要です。ユニバーサルストレージのビジョンでは、現在のストレージ構造とコンパイル済みベクトル化クエリ実行機能のパフォーマンスと予測可能性を維持し、さらに向上させます。同時に、データベースソフトウェアにさらなる機能を組み込むことで、データベースの設計、開発、運用の複雑さとコストを削減します。
7.0 リリースでは、上記で概説したお客様の要件を解決し、最終的には 2 つの異なる方法で「Universal Storage」のビジョンを実現すること を目指しています。1 つは、スパース行ストアが同じ量の RAM でより多くのデータを保存できるようにすることで、シークに対して低い変動で優れたパフォーマンスを維持しながら TCO を削減することです。これは、スパース インメモリ圧縮によって実現されます。もう 1 つは、高度な同時読み取り/書き込みアクセスを可能にするシーク可能な列ストアをサポートすることです。はい、その通りです。シーク可能な列ストアです。これは矛盾ではありません。これを実現するために、ハッシュ インデックスと列ストアの新しい行レベルのロック スキーム、および列ストアの列の小さな部分を独立して効率的に読み取る方法であるサブセグメント アクセスを使用します。
以下では、SingleStoreDB Self-Managed 7.0におけるUniversal Storageのビジョン実現に向けた重要な第一歩を、どのように達成したかを説明します。そして、これはほんの始まりに過ぎません。
スパース行ストア圧縮
金融業界でよく見られる、NULL値の割合が高い幅の広いテーブルを持つお客様のTCOに関する懸念に対処するため、インメモリ行ストアデータを圧縮する手法を開発しました。この手法では、ビットマップを使用してどのフィールドがNULLであるかを示します。しかし、レコードの一部を固定幅フィールドの構造として維持することで、NULL値のデータ保存量を削減するというこの確立された手法に独自の工夫を加えました。これにより、コンパイル済みクエリの実行とインデックスシークは、最高レベルのパフォーマンスを維持できます。基本的に、レコードを2つの部分に分割します。1つは非スパースフィールドとインデックスキーを含む固定幅部分、もう1つはスパースとして指定されたフィールドを含む可変幅部分です。
NULLビットマップは、将来の拡張に備え、フィールドごとに1ビットではなく4ビットを使用します。空白やゼロなどのデフォルト値を圧縮する機能を追加できるほか、通常は固定幅のフィールドを可変幅フィールドとして保存する機能も備えています。例えば、bigintとして宣言された小さな整数は、8バイトではなく数バイトで保存できます。
次の図は、4つの列を持つテーブルでスパース圧縮がどのように機能するかを示しています。このテーブルには最後の3つの列がSPARSE列として指定されています(最初の列は一意のNOT NULL列であるため、SPARSE列として指定さ れていないものとします)。最初の列がスパース列ではなく、最後の3つの列がスパース列である可能性があるという事実は、テーブルレベルのメタデータに記録されます。

SPARSE フラグを設定すると、通常のフィールド幅を占める null 値ではなく、フラグによって示される null 値が適切なフィールドに設定されます。
表では、ワイドフィールドの幅は32ビット、ナローフィールドの幅は4ビットを表しています。実際のスペース使用量はインデックスやストレージ割り当て構造の有無にも依存するため、簡単にまとめることはできませんが、この図はNULLになり得るスパースフィールドのスペース節約を視覚的に表すのに便利です。
SPARSE圧縮の最適な対象は、NULL値が半分以上を占めるワイドな行ストアテーブルです。以下に例を示します。
1CREATE TABLE t (2 c1 double,3 c2 double,4 -- …5 c300 double6) compression = sparse;
Specifying compression = sparse at the end of CREATE TABLE causes SingleStore to use sparse encoding for nullable structured fields, including numbers, dates, datetimes, timestamps, times, and varchars.
Using this table schema with SingleStoreDB Self-Managed 7.0, loaded with 1.05 million rows, of which two-thirds are NULL, we observe the following memory usage with no compression vs. roughly half the memory usage with sparse compression:
compression = sparse をCREATE TABLE の最後に指定すると、SingleStore は数値、日付、日付時刻、タイムスタンプ、時刻、varchar などの null 許容構造化フィールドにスパース エンコーディングを使用します。
このテーブル スキーマを SingleStoreDB Self-Managed 7.0 で使用すると、105 万行 (そのうち 3 分の 2 は NULL) がロードされ、圧縮なしの場合のメモリ使用量は次のようになりますが、スパース圧縮の場合はメモリ使用量が約半分になります。
圧縮設定 | メモリ使用量 | 節約 (パーセント) |
NONE | 2.62GB | N/A |
SPARSE | 1.23GB | 53% |
つまり、3分の2がNULL値であるこの幅の広いテーブルでは、同じRAM容量で2倍以上のデータを保存できます。これはもちろん、TCOの大幅な削減につながるだけでなく、SingleStoreを活用してより大きな課題に取り組み、より多くのビジネス価値を生み出すことも可能にします。
この実験に使用された MPSQL コードは付録 A に記載されています。
注意:テーブルメモリ使用量を計算するための便利なクエリは次のとおりです。
1select database_name, table_name, format(sum(memory_use), 0) m2from information_schema.table_statistics3group by 1, 2;
これにより、各行ストア テーブルに実際に使用されたメモリが示されます。
