
2026/01/31 1:02
近代データベースシステム向けの効率的な文字列圧縮
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
CedarDBはテキスト列に対してFast Static Symbol Table(FSST)圧縮を追加し、総ストレージ容量を約20–40 %削減、文字列データを約35–60 %削減します。ClickBenchとTPC‑Hでのベンチマークでは、FSST使用時にコールドランクエリ時間が最大40 %向上することが示されています。CedarDBは、サイズ優位性が少なくとも40 %ある場合のみFSSTを選択し、高いデコンプレッションコストを緩和します。FSST導入以前は、未圧縮、単一値圧縮、および辞書圧縮の3種類を提供していました。辞書キーは1回だけ保存され、予測子に対するSIMDフレンドリーなバイナリ検索が可能です。文字列は実際のデータの約半分を占め、フィルタ操作を支配するため、効率的なテキスト圧縮の必要性が高いことを示しています。将来のリリースでは、
を介して詳細な圧縮メトリクスを公開し、コミュニティダウンロードを提供し、さらなる最適化へのサポートも行います。cedardb_compression_infos
注意: ホットランパフォーマンスは、多くの文字列をデコンプレッションする必要があるクエリでは最大2.8倍遅くなる可能性があります(ただし、一部のクエリでは約25 %の高速化を実現)。これらのトレードオフは、40 %サイズ優位性ルールにより管理されます。
本文
2026年1月29日 • 17 分
バージョン v2026‑01‑22 以降、CedarDB はテキスト列に対して FSST(Fast Static Symbol Table)という新しい圧縮方式を適用し、保存サイズを半減させつつクエリ速度も向上させました。
この記事では、その実装詳細と FSST を統合する際のトレードオフについて共有します。
文字列に注目すべき理由
文字列を扱う必要がないなら、なぜ圧縮しようというのでしょうか?
- 文字列は至る所に存在 – 実世界で最も頻繁に使われるデータ型です。約50 %のデータが文字列として保存されています。
- 文字列は 柔軟 で 便利:エンム(enum)や UUID などより適切な型があっても、ほぼすべてを文字列として格納できます。
- Snowflake の最新調査では 文字列列 が最も多く使われるデータ型かつフィルタで最頻使用されることが示されています。
効率的な保存と高速なクエリ応答は不可欠です。
文字列を圧縮したい理由
圧縮によりサイズが減少し、クラウドストレージやローカルディスクのコストを削減できます。データベースシステムではさらに:
- メモリフットプリントを減らす:CPU キャッシュに収まることでアクセス速度が10倍向上します。
- 帯域幅効率化:小さなデータはディスク‑RAM‑CPU パイプラインで高速に転送されます。
CedarDB の現在の圧縮スイート
2026年1月22日以前、CedarDB は文字列に対して以下の方式をサポートしていました。
| 圧縮方式 | 適用条件 |
|---|---|
| 未圧縮 | 文字列が非常に短い場合。圧縮のメリットが薄い。 |
| 単一値 | 異なる値が1つだけ存在する場合。 |
| 辞書 | ラグジュアル順序付けされた辞書でオフセットと任意のキー切り捨て(1–2バイト)を使用。 |
辞書圧縮の詳細
- ユニーク値を辞書に格納。
- 各文字列を辞書エントリを指す整数 キー に置き換える。
- 直接文字列へジャンプできるよう オフセット を保持。
- ラグジュアル順序の辞書はキーで二分探索が可能で、未圧縮文字列と同じ順序になります。
メリット
- 整数比較による高速な等価チェック(SIMD も利用可)。
- フィルタリング時にすべての文字列をデコードする必要がない。
デメリット
- 全ユニーク文字列をフルで保存するため、ユニーク値が多いと効果が薄い。
- パターンや繰り返しが激しいデータでは辞書サイズが増大してしまう。
FSST の登場
FSST とは?
- Fast Static Symbol Table (FSST) は頻繁に出現する部分文字列(シンボル)をトークナイズし、1 バイト コード に置き換えます。
- 最大256 個のシンボルを使用;コード255はリテラルバイト用の エスケープコード として予約されています。
- シンボルテーブルは静的で L1 キャッシュに収まり、約1 ns でアクセスできます。
圧縮プロセス
- サンプル:入力データから一部を抽出。
- シンボル表構築:
- 単体シンボルとペアの頻度を数える。
が最大になる 255 個のシンボルを選択。gain = frequency × size
- トークナイズ各文字列:
- 最長一致するシンボルをコードに置き換える。
- マッチしない場合はエスケープコード+リテラルバイトを出力。
デコード
- 圧縮データ中の各コードを参照し、対応するシンボルを書き込みます。
データベースへの FSST 統合
- シンボル表をデータと一緒に直列化:復号が不可欠です。
- 個別文字列用の オフセット を保存し、ディスク上から直接アクセス可能にします。
- 項目評価時:
- 必要な場合のみデコード。
- 等価チェックでは検索文字列を FSST で圧縮してコード同士を比較(範囲クエリには不向き)。
FSST と辞書の組み合わせ
- 最初にユニーク値の辞書を構築。
- 辞書項目だけを FSST で圧縮。
- 結果は:
- 純粋な辞書と同等の整数キーによる高速フィルタリング。
- 単独の辞書圧縮より優れた圧縮率。
DuckDB の DICT_FSST は同様の手法です。
FSST を適用するタイミング
CedarDB では ペナルティールール を採用しています:
- 入力を全ての方式で圧縮。
- 最小サイズになる方式を選択。ただし、FSST が次に小さい方式より
大きい場合は FSST を優先。X% - 実験的に
に設定。X = 40 %
ベンチマーク
保存サイズ
| ベンチマーク | FSST 効果 |
|---|---|
| ClickBench | ↓6 GB(約20 % 全体、35 % 文字列) |
| TPC‑H | ↓>40 % 全体、60 % 文字列 |
合成データのパターン(TPC‑H)はより圧縮しやすいです。
クエリ実行時間
- コールドラン(ディスクのみ):
- ClickBench:FSST を多用するクエリで最大40 %高速化。
- TPC‑H:一部クエリで最大10 %高速化。
- ホットラン(メモリキャッシュ済み):
- 一部 ClickBench クエリがデコードオーバーヘッドで最大2.8×遅延。
- 完全なデコードを必要としないクエリ(正確一致など)は約25 %の速度向上。
結論
データ圧縮は「保存コスト削減」と「デコードオーバーヘッド」のトレードオフです。
FSST を導入した結果、CedarDB は:
- 文字列列で最大60 % の保存サイズ削減を実現。
- コールドランのロード時間を大幅に短縮。
- ほとんど全ての文字列をデコードする必要があるホットランクエリでは一部性能低下。
総合的に見ると、ほとんどのワークロードでメリットがコストを上回ります。
ご質問は?
contact@cedardb.com または nicolas@cedardb.com までお気軽にご連絡ください。
ぜひ自分でも試してみてください。
コミュニティ版は公式サイトからダウンロードでき、
cedardb_compression_infos で適用された圧縮方式を確認できます。