[プレビュー] 行と列のハイブリッドストレージ
OLAPデータベースとして、StarRocksは元々列指向(カラムナ)ストレージにデータを保存しており、集計クエリのような複雑なクエリのパフォーマンスを向上させます。v3.2.3以降、StarRocksは行と列のハイブリッドストレージでのデータ保存もサポートしており、データは行ごとおよび列ごとに保存されます。この行と列のハイブリッドストレージは、主キーに基づく高い同時実行性、低遅延のポイントクエリや部分的なカラム更新などのさまざまなシナリオに適しており、列指向(カラムナ)ストレージに匹敵する効率的な分析機能を提供します。さらに、行と列のハイブリッドストレージは prepared statements をサポートしており、クエリパフォーマンスとセキュリティを向上させます。
列指向(カラムナ)ストレージと行と列のハイブリッドストレージの比較
行と列のハイブリッドストレージ
-
ストレージ方法: データは行ごとおよび列ごとに保存されます。簡単に言えば、行と列のハイブリッドストレージを使用するテーブルには、追加の隠しバイナリタイプのカラム
__row
が含まれています。データがテーブルに書き込まれると、各関与する行の値カラムからのすべての値がエンコードされ、__row
カラムに書き込まれます(以下に示すように)。データは行ごとおよび列ごとに保存されるため、追加のストレージコストが発生します。 -
シナリオ: 行ごとおよび列ごとのストレージのユーザーシナリオをサポートしますが、追加のストレージコストが発生します。
- 行ごとのストレージのユーザーシナリオ:
- 主キーに基づく高い同時実行性のポイントクエリ。
- 少数のフィールドで構成されるテーブルからのほとんどのフィールドに対するクエリ。
- 部分的なカラム更新(具体的には、複数のカラムと少数のデータ行を更新する必要がある場合)
- 列ごとのストレージのユーザーシナリオ: 複雑なデータ分析。
列指向
-
ストレージ方法: データは列ごとに保存されます。
-
シナリオ: 複雑なデータ分析。
- 大規模データセットに対する複雑なクエリと分析、例えば集計分析や多テーブルジョインクエリ。
- 多くのフィールド(例えばワイドテーブル)で構成されるテーブルですが、これらのテーブルに対するクエリは少数のカラムのみを含みます。
基本的な使用法
行と列のハイブリッドストレージを使用するテーブルを作成する
-
FEの設定項目
enable_experimental_rowstore
を有効にします。ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");
-
テーブル作成時に
PROPERTIES
で"STORE_TYPE" = "column_with_row"
を指定します。
- テーブルは主キーテーブルでなければなりません。
__row
カラムの長さは1 MBを超えることはできません。- v3.2.4以降、StarRocksは次のカラムタイプをサポートします: BITMAP, HLL, JSON, ARRAY, MAP, STRUCT。
CREATE TABLE users (
id bigint not null,
country string,
city string,
revenue bigint
)
PRIMARY KEY (id)
DISTRIBUTED by HASH (id)
PROPERTIES ("store_type" = "column_with_row");
データの挿入、削除、更新
列指向(カラムナ)ストレージを使用するテーブルと同様に、データロードとDMLステートメントを使用して、行と列のハイブリッドストレージを使用するテーブルにデータを挿入、削除、更新できます。このセクションでは、上記の行と列のハイブリッドストレージを使用するテーブルでDMLステートメントを実行する方法を示します。
-
データ行を挿入します。
-
INSERT INTO users (id, country, city, revenue)
VALUES
(1, 'USA', 'New York', 5000),
(2, 'UK', 'London', 4500),
(3, 'France', 'Paris', 6000),
(4, 'Germany', 'Berlin', 4000),
(5, 'Japan', 'Tokyo', 7000),
(6, 'Australia', 'Sydney', 7500);
-
-
データ行を削除します。
DELETE FROM users WHERE id = 6;
-
データ行を更新します。
UPDATE users SET revenue = 6500 WHERE id = 4;
データをクエリする
このセクションでは、ポイントクエリを例として使用します。ポイントクエリはショートサーキットを使用し、行指向(ロウ)ストレージで直接データをクエリするため、クエリパフォーマンスを向上させることができます。
以下の例では、上記の行と列のハイブリッドストレージを使用するテーブルを引き続き使用します。前述のテーブル作成とデータ変更操作の後、テーブルは次のようにデータを保存します。
MySQL [example_db]> SELECT * FROM users ORDER BY id;
+------+---------+----------+---------+
| id | country | city | revenue |
+------+---------+----------+---------+
| 1 | USA | New York | 5000 |
| 2 | UK | London | 4500 |
| 3 | France | Paris | 6000 |
| 4 | Germany | Berlin | 6500 |
| 5 | Japan | Tokyo | 7000 |
+------+---------+----------+---------+
5 rows in set (0.03 sec)
-
クエリのショートサーキットが有効になっていることを確認します。クエリのショートサーキットが有効になると、特定の条件を満たすクエリ(クエリがポイントクエリかどうかを評価するため)はショートサーキットを使用して行指向ストレージでデータをスキャンします。
SHOW VARIABLES LIKE '%enable_short_circuit%';
クエリのショートサーキットが有効でない場合は、
SET enable_short_circuit = true;
コマンドを実行して変数enable_short_circuit
をtrue
に設定します。 -
データをクエリします。クエリがWHERE句の条件カラムにすべての主キーのカラムが含まれ、WHERE句の演算子が
=
またはIN
の場合、クエリはショートカットを使用します。注記WHERE句の条件カラムには、すべての主キーのカラムに加えて追加のカラムを含めることができます。
SELECT * FROM users WHERE id=1;
-
クエリプランを確認して、クエリがショートサーキットを使用できるかどうかを検証します。クエリプランに
Short Circuit Scan: true
が含まれている場合、クエリはショートサーキットを使用できます。MySQL [example_db]> EXPLAIN SELECT * FROM users WHERE id=1;
+---------------------------------------------------------+
| Explain String |
+---------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:1: id | 2: country | 3: city | 4: revenue |
| PARTITION: RANDOM |
| |
| RESULT SINK |
| |
| 0:OlapScanNode |
| TABLE: users |
| PREAGGREGATION: OFF. Reason: null |
| PREDICATES: 1: id = 1 |
| partitions=1/1 |
| rollup: users |
| tabletRatio=1/6 |
| tabletList=10184 |
| cardinality=-1 |
| avgRowSize=0.0 |
| Short Circuit Scan: true | -- クエリはショートカットを使用できます。
+---------------------------------------------------------+
17 rows in set (0.00 sec)
Prepared statements を使用する
prepared statements を使用して、行と列のハイブリッドストレージを使用するテーブルのデータをクエリできます。
-- 実行のためのステートメントを準備します。
PREPARE select_all_stmt FROM 'SELECT * FROM users';
PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';
-- ステートメントで変数を宣言します。
SET @id1 = 1, @id2 = 2;
-- 宣言された変数を使用してステートメントを実行します。
-- ID 1 または 2 のデータを個別にクエリします。
EXECUTE select_by_id_stmt USING @id1;
EXECUTE select_by_id_stmt USING @id2;
制限事項
- 現在、StarRocks 共有データクラスタは行と列のハイブリッドストレージをサポートしていません。
- v3.2.4以降、行と列のハイブリッドストレージを使用するテーブルは ALTER TABLE を使用して変更できます。
- クエリのショートサーキットは現在、スケジュールされたバッチデータロード後に発生するクエリにのみ適しています。クエリのショートサーキットがデータ書き込みプロセスの適用段階で発生すると、インデックスの排他が発生する可能性があるため、データ書き込みがクエリのショートサーキットをブロックし、データ書き込み中のポイントクエリの応答時間に影響を与える可能性があります。
- 行と列のハイブリッドストレージはストレージ消費を大幅に増加させる可能性があります。これは、データが行と列の両方の形式で保存され、行指向ストレージのデータ圧縮率が列指向ストレージほど高くない可能性があるためです。
- 行と列のハイブリッドストレージはデータロード中の時間とリソース消費を増加させる可能性があります。
- 行と列のハイブリッドストレージを使用するテーブルはオンラインサービスに対する有効なソリューションとなる可能性がありますが、このタイプのテーブルのパフォーマンスは成熟したOLTPデータベースと競合するものではないかもしれません。
- 行と列のハイブリッドストレージを使用するテーブルは、列指向ストレージに依存する機能、例えばカラムモードでの部分更新をサポートしていません。
- 行と列のハイブリッドストレージを使用するテーブルは主キーテーブルでなければなりません。