ユニークキーテーブル
テーブルを作成する際に、プライマリキーカラムとメトリックカラムを定義できます。これにより、同じプライマリキーを持つレコードのグループの中で、最も新しいレコードがクエリで返されます。重複キーテーブルと比較して、ユニークキーテーブルはデータロードプロセスを簡素化し、リアルタイムで頻繁なデータ更新をより良くサポートします。
シナリオ
ユニークキーテーブルは、データがリアルタイムで頻繁に更新される必要があるビジネスシナリオに適しています。例えば、eコマースのシナリオでは、1日に数億件の注文が行われ、注文のステータスが頻繁に変わります。
原理
ユニークキーテーブルは、同じプライマリキーを持つレコードのグループの中で最も新しいレコードを返すために、メトリックカラムに REPLACE 集計関数が指定された特別な集計キーテーブルと考えることができます。
ユニークキーテーブルを使用するテーブルにデータをロードする際、データは複数のバッチに分割されます。各バッチにはバージョン番号が割り当てられます。したがって、同じプライマリキーを持つレコードは複数のバージョンで存在する可能性があり、その中で最も新しいバージョン(つまり、最大のバージョン番号を持つレコード)がクエリで取得されます。
次の表に示すように、ID
はプライマリキーカラム、value
はメトリックカラム、_version
は StarRocks 内で生成されたデータバージョン番号を保持します。この例では、ID
が 1 のレコードはバージョン番号が 1
と 2
の2つのバッチでロードされ、ID
が 2
のレコードはバージョン番号が 3
、4
、5
の3つのバッチでロードされます。
ID | value | _version |
---|---|---|
1 | 100 | 1 |
1 | 101 | 2 |
2 | 100 | 3 |
2 | 101 | 4 |
2 | 102 | 5 |
ID
が 1
のレコードをクエリすると、最も新しいバージョン番号 2
のレコードが返されます。ID
が 2
のレコードをクエリすると、最も新しいバージョン番号 5
のレコードが返されます。次の表は、2つのクエリで返されるレコードを示しています。
ID | value |
---|---|
1 | 101 |
2 | 102 |
テーブルの作成
eコマースのシナリオでは、注文のステータスを日付ごとに収集して分析する必要がよくあります。この例では、orders
という名前のテーブルを作成し、注文を保持します。create_time
と order_id
をプライマリキーカラムとして定義し、order_state
と total_price
の2つのカラムをメトリックカラムとして定義します。これにより、注文のステータスが変わるとリアルタイムで更新され、クエリを加速するために迅速にフィルタリングできます。
テーブルを作成するためのステートメントは次のとおりです。
CREATE TABLE IF NOT EXISTS orders (
create_time DATE NOT NULL COMMENT "create time of an order",
order_id BIGINT NOT NULL COMMENT "id of an order",
order_state INT COMMENT "state of an order",
total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 8;
使用上の注意
-
テーブルのプライマリキーについて、次の点に注意してください:
- プライマリキーは
UNIQUE KEY
キーワードを使用して定義されます。 - プライマリキーは、一意制約が適用され、名前を変更できないカラムに作成する必要があります。
- プライマリキーは適切に設計する必要があります:
- クエリが実行されると、プライマリキーカラムは複数のデータバージョンの集約前にフィルタリングされ、メトリックカラムは複数のデータバージョンの集約後にフィルタリングされます。したがって、フィルタ条件として頻繁に使用されるカラムを特定し、これらのカラムをプライマリキーカラムとして定義することをお勧めします。これにより、複数のデータバージョンの集約前にデータフィルタリングを開始し、クエリパフォーマンスを向上させることができます。
- 集約プロセス中に、StarRocks はすべてのプライマリキーカラムを比較します。これは時間がかかり、クエリパフォーマンスを低下させる可能性があります。したがって、多数のプライマリキーカラムを定義しないでください。クエリのフィルタ条件としてほとんど使用されないカラムは、プライマリキーカラムとして定義しないことをお勧めします。
- プライマリキーは
-
テーブルを作成する際、テーブルのメトリックカラムに BITMAP インデックスや Bloom Filter インデックスを作成することはできません。
-
ユニークキーテーブルはマテリアライズドビューをサポートしていません。
次のステップ
テーブルが作成されたら、さまざまなデータ取り込み方法を使用して StarRocks にデータをロードできます。StarRocks がサポートするデータ取り込み方法については、 Data import を参照してください。
- ユニークキーテーブルを使用するテーブルにデータをロードする際、テーブルのすべてのカラムを更新する必要があります。例えば、前述の
orders
テーブルを更新する場合、create_time
、order_id
、order_state
、total_price
のすべてのカラムを更新する必要があります。- ユニークキーテーブルを使用するテーブルからデータをクエリする際、StarRocks は複数のデータバージョンのレコードを集約する必要があります。この状況では、多数のデータバージョンがクエリパフォーマンスを低下させます。したがって、リアルタイムデータ分析の要件を満たしつつ、多数のデータバージョンを防ぐために、テーブルへのデータロードの適切な頻度を指定することをお勧めします。分単位のデータが必要な場合、1秒ごとのロード頻度ではなく、1分ごとのロード頻度を指定できます。