パフォーマンス最適化
テーブルタイプの選択
StarRocks は 4 つのテーブルタイプをサポートしています: 重複キーテーブル、集計テーブル、ユニークキーテーブル、主キーテーブル。これらはすべて KEY でソートされています。
AGGREGATE KEY
: 同じ AGGREGATE KEY を持つレコードが StarRocks にロードされると、古いレ コードと新しいレコードが集計されます。現在、集計テーブルは次の集計関数をサポートしています: SUM、MIN、MAX、および REPLACE。集計テーブルはデータを事前に集計し、ビジネスステートメントや多次元分析を容易にします。DUPLICATE KEY
: 重複キーテーブルではソートキーを指定するだけで済みます。同じ DUPLICATE KEY を持つレコードは同時に存在します。事前にデータを集計しない分析に適しています。UNIQUE KEY
: 同じ UNIQUE KEY を持つレコードが StarRocks にロードされると、新しいレコードが古いレコードを上書きします。ユニークキーテーブルは、REPLACE 関数を持つ集計テーブルに似ています。どちらも定期的な更新を伴う分析に適しています。PRIMARY KEY
: 主キーテーブルはレコードの一意性を保証し、リアルタイムの更新を可能にします。
CREATE TABLE site_visit
(
siteid INT,
city SMALLINT,
username VARCHAR(32),
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, city, username)
DISTRIBUTED BY HASH(siteid);
CREATE TABLE session_data
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid);
CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
UNIQUE KEY(orderid)
DISTRIBUTED BY HASH(orderid);
CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
PRIMARY KEY(orderid)
DISTRIBUTED BY HASH(orderid);
コロケートテーブル
クエリを高速化するために、同じ分散を持つテーブルは共通のバケッティングカラムを使用できます。この場合、データは join
操作中にクラスター間で転送されることなくローカルでジョインされます。
CREATE TABLE colocate_table
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid)
PROPERTIES(
"colocate_with" = "group1"
);
コロケートジョインとレプリカ管理の詳細については、 Colocate join を参照してください。
フラットテーブルとスタースキーマ
StarRocks はスタースキーマをサポートしており、フラットテーブルよりも柔軟にモデリングできます。モデリング中にビューを作成してフラットテーブルを置き換え、複数のテーブルからデータをクエリしてクエリを高速化できます。
フラットテーブルには以下の欠点があります:
- フラットテーブルは通常、多数のディメンションを含むため、ディメンションの更新にコストがかかります。ディメンションが更新されるたびに、テーブル全体を更新する必要があります。更新頻度が増すと状況は悪化します。
- フラットテーブルは追加の開発作業、ストレージスペース、データのバックフィル操作を必要とするため、メンテナンスコストが高くなります。
- フラットテーブルには多くのフィールドがあり、集計テーブルにはさらに多くのキー フィールドが含まれる可能性があるため、データ取り込みコストが高くなります。データロード中に、より多くのフィールドをソートする必要があり、データロードが長引きます。
クエリの同時実行性や低レイテンシーに対する要求が高い場合は、フラットテーブルを使用することもできます。
パーティションとバケット
StarRocks は 2 レベルのパーティショニング をサポートしています: 第一レベルは RANGE パーティションで、第二レベルは HASH バケットです。
-
RANGE パーティション: RANGE パーティションはデータを異なる間隔に分割するために使用されます(元のテーブルを複数のサブテーブルに分割することと理解できます)。ほとんどのユーザーは時間でパーティションを設定することを選択し、次の利点があります:
- ホットデータとコールドデータを区別しやすくなります
- StarRocks 階層型ストレージ (SSD + SATA) を活用できます
- パーティションごとにデータを削除するのが速くなります
-
HASH バケット: ハッシュ値に基づいてデータを異なるバケットに分割します。
- データの偏りを避けるために、バケッティングには識別度の高いカラムを使用することをお勧めします。
- データの復旧を容易にするために、各バケット内の圧縮データのサイズを 100 MB から 1 GB の間に保つことをお勧めします。テーブルを作成するかパーティションを追加する際に、適切なバケット数を設定することをお勧めします。
- ランダムバケット法は推奨されません。テーブルを作成する際には、HASH バケッティングカラムを明示的に指定する必要があります。