ユニークキーテーブル
テーブルを作成する際に、プライマリキー列とメトリック列を定義できます。これにより、同じプライマリキーを持つレコード群の中で最も新しいレコードをクエリで返すことができます。重複キーテーブルと比較して、ユニークキーテーブルはデータロードプロセスを簡素化し、リアルタイムかつ頻繁なデータ更新をより良くサポートします。
シナリオ
ユニークキーテーブルは、データがリアルタイムで頻繁に更新される必要があるビジネスシナリオに適しています。例えば、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 をプライマリキー列として定義し、注文をフィルタリングする条件として頻繁に使用されるようにします。他の2つの列、order_state と total_price をメトリック列として定義します。これにより、注文のステータスが変わるたびにリアルタイムで更新され、クエリを高速化するために迅速にフィルタリングできます。
テーブルを作成するためのステートメントは次のとおりです。
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);
注意