メインコンテンツまでスキップ

使用上の注意

カラム型の提案

テーブル作成時のカラム型に関する提案:

  1. KeyカラムはすべてのValueカラムより前に配置する必要があります。
  2. 可能な限り、integer型を選択してください。これは、integer型の計算および検索効率が文字列よりもはるかに高いためです。
  3. 異なる長さのinteger型を選択する場合は、十分性の原則に従ってください。
  4. VARCHARおよびSTRING型の長さについても、十分性の原則に従ってください。

Aggregateモデルの制限事項

このセクションでは、Aggregate Modelの制限事項について説明します。

Aggregate Modelは集約されたデータのみを表示します。つまり、まだ集約されていないデータ(例:2つの異なるインポートバッチ)のデータ表現の一貫性を保証する必要があります。以下、例を用いてさらに詳しく説明します。

以下のようなテーブルスキーマがあると仮定します:

ColumnNameタイプAggregationTypeコメント
user_idLARGEINTUser ID
dateDATEDate when the data are imported
costBIGINTSUMTotal user consumption

2つのバッチのデータが以下のようにストレージエンジンにインポートされたと仮定します:

batch 1

user_iddatecost
100012017-11-2050
100022017-11-2139

batch 2

user_iddatecost
100012017-11-201
100012017-11-215
100032017-11-2222

ご覧のように、これら2つのインポートバッチにおけるUser 10001のデータはまだ集約されていません。しかし、ユーザーが以下のような集約されたデータのみをクエリできることを保証するために:

user_iddatecost
100012017-11-2051
100012017-11-215
100022017-11-2139
100032017-11-2222

データの表現の一貫性を保証するために、クエリエンジンに集約演算子を追加しました。

さらに、集約カラム(Value)において、集約タイプと一致しない集約クラスのクエリを実行する場合は、セマンティクスに注意してください。例えば、上記の例で以下のクエリを実行する場合:

SELECT MIN(cost) FROM table;

結果は1ではなく5になります。

一方、この一貫性保証により、一部のクエリの効率が大幅に低下する可能性があります。

基本的なcount (*)クエリを例に取ります:

SELECT COUNT(*) FROM table;

他のデータベースでは、このようなクエリは迅速に結果を返します。実際の実装では、モデルがインポート時に行数をカウントして統計を保存することでクエリ結果を取得したり、クエリ時に特定の1つのカラムのデータのみをスキャンしてcount値を取得したりすることができ、オーバーヘッドは非常に少ないためです。しかし、DorisのAggregation Modelでは、このようなクエリのオーバーヘッドは大きくなります。

前の例において:

batch 1

user_iddatecost
100012017-11-2050
100022017-11-2139

batch 2

user_iddatecost
100012017-11-201
100012017-11-215
100032017-11-2222

最終的な集約結果は以下のようになります:

user_iddatecost
100012017-11-2051
100012017-11-215
100022017-11-2139
100032017-11-2222

select count (*) from table;の正しい結果は4であるべきです。しかし、モデルがuser_idカラムのみをスキャンし、クエリ時に集約操作を実行した場合、最終結果は3(10001、10002、10003)になります。集約操作を実行しない場合、最終結果は5(2つのバッチの合計5行)になります。明らかに、両方の結果は間違っています。

正しい結果を得るために、user_iddateカラムの両方を読み取り、クエリ時に集約を実行する必要があります。つまり、count (*)クエリでは、Dorisはセマンティクス的に正しい結果を得るために、すべてのAGGREGATE KEYカラム(この場合、user_iddate)をスキャンして集約する必要があります。つまり、集約カラムが多い場合、count (*)クエリは大量のデータをスキャンすることになります。

したがって、頻繁にcount (*)クエリを実行する必要がある場合は、値1で集約タイプSUMのカラムを追加してcount (*)をシミュレートすることをお勧めします。この方法では、前の例のテーブルスキーマは以下のように変更されます:

ColumnNameタイプAggregationTypeコメント
user IDBIGINTUser ID
dateDATEDate when the data are imported
CostBIGINTSUMTotal user consumption
countBIGINTSUMFor count queries

上記はcountカラムを追加し、その値は常に1になります。そのため、select count (*) from table;の結果はselect sum (count) from table;の結果と同等になります。後者は前者よりもはるかに効率的です。しかし、この方法にも欠点があります。つまり、ユーザーがAGGREGATE KEYカラムで同じ値を持つ行をインポートしないことが必要です。そうでなければ、select sum (count) from table;select count (*) from table;のセマンティクスではなく、元々インポートされたデータの行数のみを表現できます。

別の方法は、値1で集約タイプREPLACEのcoundカラムを追加することです。そうすると、select sum (count) from table;select count (*) from table;は同じ結果を生成できます。さらに、この方法ではインポートデータに同じAGGREGATE KEYカラムがないことを要求しません。

MoW Unique Key Model

Unique ModelのMerge on Write実装は、Aggregate Modelと同じ制限を課しません。Merge on Writeでは、モデルは各インポートされたrowsetにdelete bitmapを追加して、上書きまたは削除されるデータをマークします。前の例では、Batch 1がインポートされた後、データステータスは以下のようになります:

batch 1

user_iddatecostdelete bit
100012017-11-2050false
100022017-11-2139false

Batch 2がインポートされた後、最初のバッチの重複する行は削除済みとしてマークされ、2つのバッチのデータのステータスは以下のようになります

batch 1

user_iddatecostdelete bit
100012017-11-2050true
100022017-11-2139false

batch 2

user_iddatecostdelete bit
100012017-11-201false
100012017-11-215false
100032017-11-2222false

クエリでは、delete bitmaptrueとマークされたすべてのデータは読み取られないため、データ集約は不要です。上記のデータには4つの有効な行があるため、クエリ結果も4になるべきです。これは1つのカラムのデータのみをスキャンするため、最小限のオーバーヘッドも可能にします。

テスト環境では、Unique ModelのMerge on Writeにおけるcount(*)クエリは、Aggregate Modelよりも10倍高いパフォーマンスを提供します。

Duplicateモデル

Duplicate Modelは集約セマンティクスを含まないため、Aggregate Modelと同じ制限を課しません。どのカラムでも、count (*)クエリでセマンティクス的に正しい結果を返すことができます。

Keyカラム

Duplicate、Aggregate、Unique Modelでは、テーブル作成時にKeyカラムが指定されますが、いくつかの違いがあります:Duplicate Modelでは、テーブルのKeyカラムは単なる「ソートカラム」と見なすことができ、一意の識別子ではありません。AggregateおよびUnique Modelでは、Keyカラムは「ソートカラム」と「一意識別子カラム」の両方です。

データモデル選択の提案

データモデルはテーブル構築時に確立され、その後は取り消せないため、適切なデータモデルを選択することは非常に重要です。

  1. Aggregate Modelは事前集約により、スキャンするデータ量とクエリ計算を大幅に削減できます。そのため、固定パターンのレポートクエリシナリオに非常に適しています。しかし、このモデルはcount (*)クエリに対して不親切です。また、Valueカラムの集約方法が固定されているため、他の種類の集約クエリではセマンティクスの正確性を考慮する必要があります。
  2. Unique Modelは一意の主キーが必要なシナリオで主キーの一意性を保証します。欠点は、クエリでROLLUPなどの事前集約による利点を活用できないことです。集約クエリに対して高いパフォーマンス要件を持つユーザーには、バージョン1.2以降に新しく追加されたMerge on Write実装の使用をお勧めします。
  3. Duplicate Modelは任意の次元のアドホッククエリに適しています。事前集約機能の利点を活用できない場合もありますが、Aggregate Modelを制約する要因に制限されず、カラムストレージの利点(すべてのKeyカラムではなく、関連するカラムのみを読み取る)を十分に活用できます。
  4. ユーザーがpartial-updateを使用する必要がある場合は、ドキュメントpartial-updateを参照してください。