メインコンテンツまでスキップ
バージョン: 4.x

使用上の注意

カラムタイプの推奨事項

Table作成時のカラムタイプに関する推奨事項:

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

Aggregate Modelの制限事項

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

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

次のようなTableスキーマがあるとします:

ColumnNameタイプAggregationTypeComment
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 (*) をシミュレートすることを推奨します。この方法により、前の例のTableスキーマは次のように変更されます:

ColumnNameタイプAggregationTypeComment
user IDBIGINTUser ID
dateDATEDate when the data are imported
CostBIGINTSUMTotal user consumption
countBIGINTSUMFor count queries

上記では、値が常に1となるcountカラムを追加しているため、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 model

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

Keyカラム

Duplicate、Aggregate、Unique Modelでは、Table作成時にKeyカラムが指定されますが、いくつかの違いがあります:Duplicate Modelでは、TableのKeyカラムは単なる「ソートカラム」と見なすことができ、ユニークな識別子ではありません。AggregateとUnique Modelでは、Keyカラムは「ソートカラム」でもあり「ユニーク識別子カラム」でもあります。

データモデル選択の推奨事項

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

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