データベースのワークロード#
OLTP#
OLTP: オンライントランザクション処理
小規模なデータの読み取りと更新を高速に行う操作。
OLAP#
OLAP: オンライン分析処理
複雑な分析操作をサポートし、意思決定を提供するためのもの。
HTAP#
ハイブリッドトランザクション + 分析処理
OLTP と OLAP を組み合わせた新しいワークロード。
ストレージモデル#
N-Ary ストレージモデル(NSM)#
n-ary
ストレージモードでは、DBMS はすべての属性を含むすべてのタプルを連続して 1 つのページに格納します。
これは OLTP にとって非常に理想的です。
利点:
- 挿入、更新、削除が非常に高速です。
- タプル全体が必要なクエリに非常に適しています。
欠点:
- テーブル全体をスキャンするクエリや 1 つの属性のみが必要なクエリには非常に適していません。
分解ストレージモデル(DSM)#
すべてのタプルの各属性を個別に格納します。
列ストア(column store)とも呼ばれます。
読み取り専用の OLAP 操作に非常に適しており、特に一部の属性のみをスキャンする操作に適しています。
利点:
- I/O の浪費を減らします。
- クエリの実行とデータの圧縮が向上します。
欠点:
- 単一のポイントの変更、クエリの更新などの操作には遅いです。
この操作を実現するためには、通常、2 つの方法があります。
- 各属性に固定のビット幅を設定し、必要なデータを正確に検索するためにオフセットを取得するだけです。
- よりまれな方法として、値を格納するために
(id : pos)
のような形式のタプルを使用する方法もあります。
データベースの圧縮#
I/O は非常に時間がかかるため、DBMS では一般的に圧縮アルゴリズムを使用してパフォーマンスを向上させるために使用されます。
通常、速度と圧縮率の間でトレードオフをする必要があります。
圧縮の粒度#
- ブロックレベル
- タプルレベル(NSM のみ)
- 属性レベル
- 列レベル
ナイーブな圧縮#
一般的な圧縮アルゴリズムを使用する方法もあります。ただし、この方法を使用すると、DBMS は操作しているデータが何であるかを解凍するまで知りません。
提供される入力:
→ LZO(1996 年)、LZ4(2011 年)、Snappy(2011 年)、Oracle OZIP(2014 年)、Zstd(2015 年)
速度を向上させるために、圧縮後でも情報を取得して高速化する方法が必要です。
列圧縮#
Run-Length Encoding(RLE)#
同じ列に連続して出現する値を(value : pos : num)
のような形式のトリプレットで圧縮することができます。
ここで:
value
は値を表します。pos
はその値の開始位置を表します。num
はその値の繰り返し回数を表します。
ただし、この方法にはいくつかの欠点がある可能性があります。
変換後
Bit-Packing Encoding#
一部のデータは非常に冗長であるため、ビットパッキングを使用してこの冗長性を減らすことができます。
int64
をint8
に変換することで、必要なスペースを大幅に削減できます。
ただし、この方法にはいくつかの欠点があり、一部の情報がint8
に合わない可能性があります。
したがって、次のように保存する必要があります。
ただし、この方法は追加のストレージが少ない場合にのみ使用できます。
ビットマップエンコーディング#
各属性に少数のデータがある場合、ビットマップを使用して保存できます。
たとえば、F
とM
の 2 つの値しか存在しない場合、01
で表すことができます。
Delta Encoding#
多くの場合、室温などの統計結果には特定の範囲内で密集した値が存在する場合があります。
そのため、特定の値を決定した後、その後のすべての値はdelta
の形式で保存できます。
Incremental Encoding#
通常、接頭辞 / 接尾辞を取ることで最終結果を得ることもできます。
辞書圧縮#
1 つのテーブルに複数の値が存在し、これらの値が異なる場所に存在する場合、辞書の形式で値の位置を取得できます。
これは最も一般的な圧縮方法です。