SelectDB はハイブリッド行列表ストアモードをサポートしており、デフォルトの列指向ストレージに加えて、データの追加コピーを行ベースのフォーマットで格納します。この機能により、I/O アンプリフィケーションが解消され、高い同時実行性を持つポイントクエリのパフォーマンスが向上します。
概要
デフォルトでは、SelectDB は列指向ストレージを使用します。これは集約やフィルターなどの大規模な分析クエリに対して大きな利点をもたらします。しかし、プライマリキーによる少数の行を取得するような高い同時実行性のポイントクエリでは、列指向ストレージは各列からデータを読み取り、マージする必要があります。このプロセスによりランダム I/O が大量に発生し、パフォーマンスが低下します。
ハイブリッド行列表ストアは、行ベースのフォーマットで別途データレプリカを保持することでこの課題に対処します。これにより、ポイントクエリはローストアから直接完全な行を読み取ることができ、複数の列にわたるランダム I/O を回避し、高い同時実行性のポイントクエリのパフォーマンスを大幅に向上させます。
この機能は、以下のユースケースに最適です。
注文詳細やユーザープロファイルの参照など、プライマリキーに基づく高い同時実行性のポイントクエリ。
SELECT *クエリで、行のすべてまたは大部分の列を返すもの。
ハイブリッド行列表ストアを有効にすると、列数やデータ特性に応じてストレージ容量がおよそ 2 ~ 4 倍増加する可能性があります。パフォーマンスとストレージコストのバランスを考慮し、高い同時実行性のポイントクエリが必要なテーブルでのみこの機能を有効にしてください。
構文
ハイブリッド行列表ストアを有効にするには、CREATE TABLE 文の PROPERTIES 句で以下のパラメーターを設定します。
パラメーター | 説明 | デフォルト |
| ローストアを有効にします。 |
|
| ローストアに含める列のカンマ区切りリストを指定します。これにより、一部の列のみを格納してストレージ容量を節約できます。このパラメーターが設定されていない場合、 | 空(未指定の場合、全列が格納されます)。 |
| ローストアのデータページ(Page)のサイズ(バイト単位)です。Page はストレージの読み書き操作における最小単位です。行の読み取りには少なくとも 1 回の Page I/O が発生します。値を小さくするとポイントクエリのパフォーマンスが向上しますが、ストレージ容量が多く必要になります。逆に値を大きくするとストレージ容量は節約されますが、ポイントクエリの I/O オーバーヘッドが増加します。ポイントクエリのパフォーマンスを重視する場合は、4096(4 KB)などの小さい値を設定してください。ストレージ容量を節約したい場合は、65536(64 KB)などの大きい値を設定してください。 |
|
ローストアのヒット条件
ハイブリッド行列表ストアが有効になっている場合、オプティマイザーは以下の 2 つのシナリオでローストアを使用します。
高い同時実行性のプライマリキーポイントクエリ
以下の条件をすべて満たす必要があります。
テーブルが Merge-on-Write(MOW)実装を用いた Unique Key モデルを使用しており、テーブル作成時に
enable_unique_key_merge_on_write = trueが設定されていること。ローストアは、
store_row_column = trueを設定するか、row_store_columnsで列を指定することにより有効になります。クエリの WHERE 句にすべてのプライマリキー列に対する等価条件が含まれており、かつそれらが AND で接続されていること。例:
SELECT * FROM tbl WHERE k1 = 1 AND k2 = 2。
ローストアに一部の列のみが含まれている(row_store_columns で指定)場合、クエリでローストアに含まれていない列が要求されると、その列は列指向ストレージからフェッチされます。この最適化が適用されたかどうかを確認するには、EXPLAIN プランに SHORT-CIRCUIT フラグが含まれているかを確認してください。詳細については、「高い同時実行性のポイントクエリ」をご参照ください。
一般的な SELECT * クエリ
以下の条件をすべて満たす必要があります。
テーブルが Duplicate Key モデルまたは Unique Key モデル(MOW テーブル)を使用していること。
全列に対してローストアが有効になっていること(
store_row_column = true)。クエリが
SELECT *文であり、ORDER BY句およびLIMIT句を含んでおり、遅延マテリアライズ最適化がトリガーされること。
例:
SELECT * FROM tbl WHERE k < 10 ORDER BY k LIMIT 10;ローストアが使用されたことを確認するには、EXPLAIN プランに FETCH ROW STORE および OPT TWO PHASE マーカーが含まれているかを確認してください。
集約や範囲スキャンなどの分析クエリでは、引き続き列指向ストレージパスが使用され、分析パフォーマンスが最適化されます。
使用例
ローストアのプロパティはテーブル作成時に設定され、後から変更することはできません。
フルローストアの有効化
テーブルの全列に対してローストアを有効にします。これは、高い同時実行性のシナリオにおける SELECT * ポイントクエリに最適です。
CREATE TABLE user_profile (
user_id BIGINT,
user_name VARCHAR(64),
age INT,
city VARCHAR(32),
register_date DATE
)
UNIQUE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 16
PROPERTIES (
"store_row_column" = "true",
"enable_unique_key_merge_on_write" = "true"
);部分的なローストアの有効化
頻繁にクエリされる一部の列に対してローストアを有効にします。これにより、ポイントクエリのパフォーマンスを向上させながらストレージ容量を節約できます。
CREATE TABLE order_info (
order_id BIGINT,
user_id BIGINT,
amount DECIMAL(12, 2),
status INT,
create_time DATETIME,
detail VARCHAR(1024)
)
UNIQUE KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 32
PROPERTIES (
"row_store_columns" = "user_id,amount,status,create_time",
"enable_unique_key_merge_on_write" = "true"
);ローストアのページサイズ調整
多くの列や長いフィールドを持つワイドテーブルでは、row_store_page_size を大きく設定してデータページ数を減らし、読み取り効率を向上させることができます。
CREATE TABLE wide_table (
id BIGINT,
col1 VARCHAR(256),
col2 VARCHAR(256),
col3 VARCHAR(256)
)
UNIQUE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 8
PROPERTIES (
"store_row_column" = "true",
"row_store_page_size" = "65536",
"enable_unique_key_merge_on_write" = "true"
);注意事項
ローストアを有効にするとストレージ容量が増加します。一般的なシナリオでは、ストレージ使用量が元のテーブルの 2 ~ 4 倍になることがあります。正確なストレージオーバーヘッドを把握するには、実際のデータでテストしてください。
row_store_page_sizeパラメーターもストレージ容量に影響します。ビジネス要件に基づき、ポイントクエリのパフォーマンスとストレージコストのバランスを取ることを推奨します。ローストアが必要な列が一部のみの場合は、
row_store_columnsパラメーターを使用してそれらを指定してください。これにより、ストレージオーバーヘッドを大幅に削減できます。ローストアのプロパティはテーブル作成時に設定され、後から変更することはできません。