自動マテリアライズドビュー推奨
このトピックでは、自動マテリアライズドビュー推奨機能を活用して、ビジネスシナリオでクエリを高速化するために使用できるマテリアライズドビューのスキーマを生成する方法について説明します。
概要
StarRocks の非同期マテリアライズドビューは、SPJG(select-project-join-group-by)形式に基づく広く採用されている透過的なクエリの書き換えアルゴリズムを使用しています。これにより、計算コストを大幅に削減し、クエリの実行を大幅に高速化できます。しかし、マテリアライズドビューの設計は難しく、ユーザーはクエリの書き換えと高速化に適したマテリアライズドビューを設計するために多くの努力を費やす必要があります。さらに、ビジネスシナリオが変わるたびにマテリアライズドビューを再設計する必要があり、時間と労力の大きなコストが発生します。
自動マテリアライズドビュー推奨機能は、これらの問題に対処します。ビジネスシナリオのクエリステートメントを Tunespace に追加するだけで、これらのクエリを書き換え、高速化できるコスト効率の良いマテリアライズドビューのスキーマを簡単に取得できます。StarRocks はクエリを解析し、その構造とクエリの書き換えに利用可能な SPJG パターンを抽象化し、情報に基づいて適切なマテリアライズドビュースキーマを計算することで、マテリアライズドビューを自動的に推奨します。これらの構造、パターン、およびクエリの他のメタデータは「Tunespace」を形成します。また、レガシーマテリアライズドビューを Tunespace に追加することもできます。StarRocks はマテリアライズドビューを解析し、Tunespace 内のクエリを高速化できる場合にそれらを推奨し、またはいくつかのマテリアライズドビューを 1 つにマージできる場合にスキーマを推奨します。マテリアライズドビューをマージすることで、マテリアライズドビューの数を減らし、それに伴うリフレッシュとストレージのコストを削減できます。Tunespace にレコードを追加または削除するたびに、StarRocks は推奨を自動的に更新し、レガシーマテリアライズドビューの再設計の手間を解消します。
StarRocks は、以下の観点から推奨されるマテリアライズドビューのパーティション戦略を最適化します:
- パーティション列が文字列型または整数型の場合、パーティション化されたマテリアライズドビューを推奨できます。
- ベーステーブルがリストパーティション化された内部テーブルの場合、StarRocks はリストパーティション化されたマテリアライズドビューを推奨できます。ベーステーブルがリストパーティション化された外部テーブルの場合、StarRocks はリストパーティション化またはレンジパーティション化されたマテリアライズドビューを推奨できます。
- ベーステーブルが外部テーブルで、そのパーティション列が日付値(たとえば
2024-01-01)を持つ文字列型の場合、StarRocks はパーティション列を DATE 型に変換し、デフォルトでレンジパーティション化されたマテリアライズドビューを推奨できます。このシナリオでリストパーティション化されたマテリアライズドビューを推奨するように StarRocks を設定することもできます。
使用方法
ステップ 1. Tunespace を作成する
構文:
CREATE TUNESPACE [IF NOT EXISTS] <tunespace_name>
tunespace_name: 作成する Tunespace の名前。
例:
CREATE TUNESPACE test_ts;
注意
Tunespace は本質的に SQL 操作を許可する通常のテーブルです。
ステップ 2. クエリを Tunespace に追加する
クエリが Tunespace に追加されると、StarRocks はクエリステートメントを解析し、Tunespace にクエリの SPJG 構造とメタデータを記録します。オプションで各クエリに名前を割り当てることができ、推奨されるマテリアライズドビューによって高速化できるクエリを表すために使用されます。
構文:
ALTER TUNESPACE <tunespace_name> APPEND ["query_name"] <query_statement>
tunespace_name: Tunespace の名前。query_name: (オプション)追加するクエリの名前。クエリ名はダブルクォーテーションで囲む必要があります。query_statement: 追加するクエリ。
例:
-- Append a query to test_ts and specify the query name as Q1.1.
ALTER TUNESPACE test_ts APPEND "Q1.1"
SELECT SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25;
-- Append a query to test_ts without specifying its name.
ALTER TUNESPACE test_ts APPEND
SELECT SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25;
ステップ 3. レガシーマテリアライズドビューで Tunespace を埋める
レガシーマテリアライズドビューが Tunespace に追加されると、StarRocks はそれを解析し、その構造とメタデータを Tunespace に記録します。レガシーマテリアライズドビューは、Tunespace に記録されたクエリを高速化できる場合に推奨されます。また、適格な場合、StarRocks はレガシーマテリアライズドビューをマージするマテリアライズドビューのスキーマを推奨します。マテリアライズドビューがどのようにマージされるかの詳細については、マテリアライズドビューマージを参照してください。
データベースまたは別の Tunespace からレガシーマテリアライズドビューで Tunespace を埋めることができます。
構文:
-- Populate the Tunespace with legacy materialized views under a database.
ALTER TUNESPACE <tunespace_name> POPULATE FROM DATABASE <database_name>
-- Populate the Tunespace with legacy materialized views from another Tunespace.
ALTER TUNESPACE <tunespace_name> POPULATE FROM TUNESPACE <source_tunespace_name>
tunespace_name: Tunespace の名前。database_name: Tunespace を埋めるために使用されるマテリアライズドビューを持つデータベースの名前。source_tunespace_name: 現在の Tunespace を埋めるために使用されるマテリアライズドビューを持つソース Tunespace の名前。
例:
-- Populate the Tunespace with legacy materialized views under the database ssb.
ALTER TUNESPACE test_ts POPULATE FROM DATABASE ssb;
-- Populate the Tunespace with legacy materialized views from another Tunespace src_ts.
ALTER TUNESPACE test_ts POPULATE FROM TUNESPACE src_ts;
ステップ 4. マテリアライズドビューの推奨を表示する
クエリとレガシーマテリアライズドビューが Tunespace に追加されると、StarRocks は推奨されるマテリアライズドビューのスキーマを自動的に計算します。SHOW RECOMMENDATIONS ステートメントを実行することで、推奨されるマテリアライズドビュースキーマを表示できます。
構文:
SHOW [SINGLE] RECOMMENDATIONS FROM <tunespace_name> [LIMIT <INT>] [OFFSET <INT>]
SINGLE: 外部テーブルに対して 1:1 のマテリアライズドビューを推奨します。このオプションを指定すると、StarRocks は外部テーブルのデータをマテリアライズドビューにマッピングします。これは本質的に外部テーブルを StarRocks のネイティブテーブルに変換するものであり、透過的なクエリの高速化を実現します。tunespace_name: Tunespace の名前。
例:
SHOW RECOMMENDATIONS FROM test_ts LIMIT 1\G
返り値:
*************************** 1. row ***************************
Id: 0
Name: _mv_20240813T150836_10da16e0ab28a28e580f570b7efef451567ecd6b
RecommendedMV: CREATE MATERIALIZED VIEW _mv_20240813T150836_10da16e0ab28a28e580f570b7efef451567ecd6b (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"session.enable_spill" = "true",
"storage_medium" = "HDD",
"replication_num" = "3"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(sum(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
HaltReason: OVERALL
TimeUsage: 3057
SamplingRatio: 1.0
CalcSteps: 8
CardQuality: EXCELLENT
RowCount: 6001215
Cardinality: 222697
CardRowCountRatio: 0.03710865216460334
Benefit: 5778518.0
NumQueriesAccelerated: 2
TotalBenefit: 1.1557036E7
AcceleratedQueries: ["Q1.1", "_mv_20240813T144425_10da16e0ab28a28e580f570b7efef451567ecd6b"]
Id: マテリアライズドビュー推奨の ID。Name: マテリアライズドビュー推奨の名前。RecommendedMV: 推奨されるマテリアライズドビューのスキーマ。HaltReason: マルチカラム結合サンプリングアルゴリズム(マテリアライズドビュー次元列カーディナリティ推定アルゴリズム)が停止する理由。以下を含みます:- ERROR: アルゴリズムがエラーに遭遇しました。
- TIMEOUT: アルゴリズムの実行がタイムアウトしました。
- REACH_LIMIT: アルゴリズムの実行が最大ステップ数(
automv_calculate_steps)に達しました。 - CONVERGENT: アルゴリズムが収束しました(2 つの連続したクエリサンプル間の推定の相対誤差が
automv_relative_error_boundを超えない)。 - OVERALL: アルゴリズムの完全なサンプリングが完了しました。
TimeUsage: マルチカラム結合サンプリングアルゴリズムの時間使用量。SamplingRatio: マルチカラム結合サンプリングアルゴリズムが停止する前の最大サンプリング比率。CalcSteps: マルチカラム結合サンプリングアルゴリズムが停止する前の進行サンプリングステップ。CardQuality: マルチカラム結合サンプリングアルゴリズムを通じて得られたカーディナリティ推定の品質。以下を含みます:- EXCELLENT
- GOOD
- PASS
- FAIL
RowCount: マテリアライズドビューの高速化なしで集計計算を行うために処理される入力行数。集計クエリが論理的なフラットテーブル上の集計計算と見なされる場合、RowCount はテーブルの行数を反映します。このフィールドはマルチカラム結合サンプリングアルゴリズムの結果の 1 つです。Cardinality: マテリアライズドビューの高速化が有効な場合にマテリアライズドビューから読み取られる行数。このフィールドはマルチカラム結合サンプリングアルゴリズムの結果の 1 つです。CardRowCountRatio:Cardinality/RowCountに相当します。Benefit: マテリアライズドビューの利益スコア。NumQueriesAccelerated: マテリアライズドビューによって高速化できるクエリの数。TotalBenefit:Benefit*NumQueriesAcceleratedに相当します。AcceleratedQueries: 推奨されるマテリアライズドビューによって高速化できるクエリの名前、またはマージできるマテリアライズドビューの名前。
Tunespace の管理
Tunespace からレコードを削除する
ID によって Tunespace からクエリまたはマテリアライズドビューのレコードを削除できます。
構文:
ALTER TUNESPACE <tunespace_name> DELETE WHERE id <operator> { id | id_list }
tunespace_name: Tunespace の名前。operator: DELETE 条件で使用される演算子。サポートされている演算子は=,>,<,>=,<=,!=,IN,NOT INです。
例:
ALTER TUNESPACE test_ts DELETE WHERE id = 1;
Tunespace を切り詰める
構文:
TRUNCATE TUNESPACE <tunespace_name>
tunespace_name: Tunespace の名前。
例:
TRUNCATE TUNESPACE test_ts;
Tunespace を削除する
構文:
DROP TUNESPACE [IF EXISTS] <tunespace_name>
tunespace_name: Tunespace の名前。
例:
DROP TUNESPACE test_ts;
マテリアライズドビューマージ
StarRocks が Tunespace 内のクエリに対してマテリアライズドビューを推奨する際、各クエリを論理的なフラットテーブル上の集計クエリとして扱います。同じ論理的なフラットテーブル上の集計クエリを持つ異なるマテリアライズドビューは、1 つのマテリアライズドビューにマージできます。StarRocks は集計クエリの構造を自動的に解析し、論理的なフラットテーブルを推測します。これは完全に仮想的なテーブルであり、メタデータには作成または記録されません。
StarRocks は 2 つの異なる方法でマテリアライズドビューをマージします: 統合とカバーリング。
-
統合は、2 つのマテリアライズドビューが同じ次元列を共有している場合に使用されます。マージ後のマテリアライズドビューの次元列は、元のマテリアライズドビューの次元列であり、メトリック列は 2 つのマテリアライズドビューのメトリック列の和集合です。
-
次の例では、Q3 は Q1 と Q2 の統合です:
-
-- Q1select d0, d1, d2, sum(v0), count(v1)from t0 inner join t1 on t0.c0 = t1.c1group by d0,d1,d2;-- Q2select d0, d1, d2, max(v2), min(v3)from t0 inner join t1 on t0.c0 = t1.c1group by d0,d1,d2;-- Q3select d0, d1, d2,sum(v0), count(v1),max(v2), min(v3)from t0 inner join t1 on t0.c0 = t1.c1group by d0,d1,d2;
-
-
カバーリングは、2 つのマテリアライズドビューの次元列が異なる場合に使用されます。マージ後のマテリアライズドビューの次元列は、元のマテリアライズドビューの次元列の和集合であり、メトリック列も同様です。
-
次の例では、Q6 は Q4 と Q5 のカバーリングです:
-
-- Q4select d0, d1, sum(v0), count(v1)from t0 inner join t1 on t0.c0 = t1.c1group by d0,d1-- Q5select d1, d2, max(v2), min(v3)from t0 inner join t1 on t0.c0 = t1.c1group by d1,d2;-- Q6select d0, d1, d2,sum(v0), count(v1),max(v2), min(v3)from t0 inner join t1 on t0.c0 = t1.c1group by d0,d1,d2;
-
2 つのマージ方法の比較
| 方法 | 統合 | カバーリング |
|---|---|---|
| 条件 | レガシーマテリアライズドビューは、同じ次元列を持っている限りマージできます。 | マージ後の次元列の数の増加は、推奨されるマテリアライズドビューの行数の増加につながる可能性があります。したがって、マージは、マージされたマテリアライズドビューとレガシーマテリアライズドビューのカーディナリティ比(ndv(d0,d1,d2)/ndv(d0,d1) および ndv(d0,d1,d2)/ndv(d1,d2))が 1 に近い場合にのみ実行されます。マテリアライズドビューの論理フラットテーブルに対するカーディナリティ比が 0.5 を超える場合、マテリアライズドビューは推奨されません。 |
| オンオフ | 常にオン | カバーリングを有効にするには、セッション変数 automv_use_cardinality_estimation を true に設定する必要があります。 |
| 動機 | マテリアライズドビューの数とそれらをリフレッシュするコストを削減するため | 理論的には、レガシーマテリアライズドビューとマージされたものの両方がクエリを高速化できます。ただし、マージされたマテリアライズドビューを使用してクエリを書き換える際には追加のロールアップ操作が必要です。その高速化効果はレガシーのものよりも優れていません。ただし、マージはマテリアライズドビューの数とそれらをリフレッシュおよび保存するコストを削減できます。 |
| 良いケース | すべてのケースが良いケースです。 | カバーリングには 2 種類の良いケースがあります。 2 つのレガシーマテリアライズドビューがあると仮定します: mv0(次元列 d0、d1、d2 を持つ)と mv1(次元列 d0、d1、d3 を持つ)。それらは mv(次元列 d0、d1、d2、d3 を持つ)にマージされます。マージ後の mv のカーディナリティがマージ前の mv0 と mv1 と同等である場合、カバーリングは最も効率的です。マージ後の mv のカーディナリティがマージ前の mv0 と mv1 に非常に近い場合も、前者ほどではありませんが良いケースです。たとえば、ndv(d0,d1,d2,d3)/ndv(d0,d1,d2) が 101% 以下であり、ndv(d0,d1,d2,d3)/ndv(d0,d1,d3) が 101% 以下である場合、カバーリング後のマテリアライズドビューはマージ前のものとほぼ同じであり、マテリアライズドビューの数を大幅に削減できます。 |
| 特殊ケース | COUNT(DISTINCT) をサポート | 集計関数のロールアップはサポートされていません。たとえば、カバーリングでは COUNT(DISTINCT) はサポートされていません。特定のケースでは、COUNT(DISTINCT) をビットマップ、array_agg、または HLL 重複排除に変換できます。これらのケースはロールアップが適用可能であるため、カバーリングをサポートします。カバーリングは、ロールアップをサポートするものに変換できる集計関数をサポートします。たとえば、avg は sum と count に変換でき、sum と count はロールアップをサポートします。 |
マージ関連のセッション変数
マルチカラム結合サンプリングアルゴリズム
automv_use_cardinality_estimation
- デフォルト: true
- 説明: 自動マテリアライズドビュー推奨のためにマルチカラムカーディナリティ推定を有効にするかどうか。有効な値:
true: 自動マテリアライズドビュー推奨のためにカーディナリティ推定を有効にします。カーディナリティ推定が有効な場合にのみ、マテリアライズドビューカバーリングが有効になります。false: カーディナリティ推定を無効にし、したがってマテリアライズドビューカバーリングを無効にします。- カーディナリティ推定が有効な場合、マテリアライズドビューマージはマルチカラムカーディナリティ推定に基づいています。推奨事項は、推定コストの降順でリストされます。この変数が
falseに設定されている場合、順序が不正確になる可能性があります。マルチカラムカーディナリティ推定の計算は時間がかかるか、不正確になる可能性があることに注意してください。必要に応じて無効にすることができます。
automv_relative_error_bound
- デフォルト: 0.05
- 説明: マルチカラムカーディナリティ推定中に、一連のクエリがサンプリングされます。後続のクエリサンプルのデータ範囲は、前のものよりも大きくなります。2 つの連続したサンプル間の相対誤差がこの値を下回ると、サンプリングが停止します。
automv_sampling_timeout
- デフォルト: 300000
- 単位: ミリ秒
- 説明: 同じ論理フラットテーブルの元のマテリアライズドビューに対するマルチカラムカーディナリティ推定のサンプリングのタイムアウト期間。
automv_calculate_steps
- デフォルト: 2147483647
- 説明: マテリアライズドビュー推奨のための貪欲アルゴリズムの最大ステップ数。マテリアライズドビュー推奨のための貪欲アルゴリズムの複雑さは O(n³) であり、これは大幅な時間消費を引き起こします。同じ論理フラットテーブルからの候補マテリアライズドビューが多数ある場合、アルゴリズムは
automv_calculate_stepsステップまでしか実行されず、トップautomv_calculate_stepsマテリアライズドビューを推奨します。このパラメータは、SHOW RECOMMENDATIONSステートメントの LIMIT 句と一緒に使用する必要があります。LIMIT 句がない場合、この変数は効果を発揮しません。
automv_sampling_ratio_low_bound
- デフォルト: 0.01
- 説明: アルゴリズムの収束とカーディナリティ推定の品質を制御します。サンプリング率がこの値に達しない場合、アルゴリズムは収束せず、カーディナリティ推定結果の品質は不十分と見なされます。
automv_min_sampling_rows
- デフォルト: 1073741824
- 説明: アルゴリズムの収束とカーディナリティ推定の品質を制御します。サンプリングされた行数がこの値に達しない場合、アルゴリズムは収束せず、カーディナリティ推定結果の品質は不十分と見なされます。
automv_sampling_buckets
- デフォルト: 512
- 説明: マルチカラム結合カーディナリティ推定中の各列のバケット数。バケット数はサンプリング SQL とともに進行的に増加します。バケットが少ないほど、アルゴリズムの収束に必要なステップが少なくなり、その逆も同様です。
マテリアライズドビューマージとプルーニング
automv_card_rowcount_ratio_lwm
- デフォルト: 0.05
- 説明:
card_rowcount_ratioの低水準マークであり、これはマテリアライズドビューの論理フラットテーブルに対するカーディナリティ比です。card_rowcount_ratioがautomv_card_rowcount_ratio_lwm未満の場合、マテリアライズドビューは低コストと見なされ、直接推奨リストに追加されます。card_rowcount_ratioがautomv_card_rowcount_ratio_hwmを超える場合、マテリアライズドビューは高コストと見なされ、破棄されます。card_rowcount_ratioがautomv_card_rowcount_ratio_lwmとautomv_card_rowcount_ratio_hwmの間にある場合、貪欲アルゴリズムがマテリアライズドビューを推奨するか破棄するかを決定します。
automv_card_rowcount_ratio_hwm
- デフォルト: 0.5
- 説明:
card_rowcount_ratioの高水準マーク。詳細については、automv_card_rowcount_ratio_lwmを参照してください。
automv_prune_rollup_unable_aggregate_with_conjuncts
- デフォルト: true
- 説明: 非ロール可能な集計関数と WHERE 述語を持つ集計クエリでは、WHERE 述語の列を候補マテリアライズドビューの次元列に含めることはできません。述語はマテリアライズドビューの WHERE 句にのみ含めることができます。一般に、このようなマテリアライズドビューは一般化能力が低く、デフォルトでは推奨されません。このセッション変数を有効にすると、そのようなマテリアライズドビューが推奨される可能性があります。
マテリアライズドビュースキーマ生成
automv_partial_rollup_min_agg_pieces
- デフォルト: 3
- 説明: T+1 シナリオでは、ユーザーは最近のデータに対してのみマテリアライズドビューを構築する必要がある場合があります。パーティション述語がレンジ述語に変換できる場合、パーティション列は次元列に追加されません。代わりに、パーティション述語がマテリアライズドビューに配置されます。この最適化は、同じパーティション列を含むパーティション述語を持つクエリの数が
automv_partial_rollup_min_agg_pieces以上の場合にのみ適用されます。パーティション述語は同一である必要はありません。StarRocks は包括的な範囲を計算します。たとえば、次のように 3 つのクエリのパーティション述語があります:- Q1:
dt > '2022-06-01' - Q2:
dt > '2022-05-31' - Q3:
dt in ('2022-05-28', '2022-07-01') - その場合、マテリアライズドビューのパーティション述語は
dt > '2022-05-28'です。現在、パーティション列を含む単純な述語のみがサポートされています。date_trunc('month', dt) > '2022-07-01'のような時間関数を含む述語はサポートされていません。
- Q1:
automv_max_order_by_columns
- デフォルト: 3
- 説明: マテリアライズドビューのショートキーに含まれる次元列の最大数。フィルタリング条件として使用される次元列がショートキー列として選択されます。日付列がベーステーブルのパーティション列として使用される場合、日付列がショートキーの最初に配置されます。
重複排除のためのロールアップ変換
automv_use_array_agg_count_distinct
- デフォルト: false
- 説明: COUNT(DISTINCT) を置き換えるために array_agg 重複排除を使用するかどうか。
automv_use_bitmap_count_distinct
- デフォルト: false
- 説明: COUNT(DISTINCT) を置き換えるためにビットマップ重複排除を使用するかどうか。TINYINT、SMALLINT、INT、および BIGINT 型のみがビットマップ重複排除をサポートしています。ユーザーは、重複排除列の値が非負であることを確認する必要があります。そうでない場合、結果は不正確になります。
automv_use_hll_count_distinct
- デフォルト: false
- 説明: 近似 COUNT(DISTINCT) のために HLL を使用するかどうか。
パーティション戦略
automv_default_partition_by_time_granule
- デフォルト: day
- 説明: マテリアライズドビューにパーティション化に使用できる次元列がある場合、この列が優先的にパーティション列として使用されます。マテリアライズドビューの次元列がパーティション列として使用できず、マテリアライズドビュー内のすべてのメトリック列がロールアップのために書き換え可能な場合、推奨アルゴリズムはベーステーブルのパーティション列をマテリアライズドビューの次元列にデフォルトのパーティション列として追加しようとします。このパラメータは、マテリアライズドビューのデフォルトのパーティショニング粒度を設定するために使用されます。有効な値は
year、quarter、month、day、hour、およびnone(デフォルトのパーティション列補完ロジックを無効にすることを示す)です。
automv_prefer_range_partition
- デフォルト: true
- 説明: ベーステーブルが外部テーブルで、そのパーティション列が日付値(たとえば
2024-01-01)を持つ文字列型の場合に、レンジパーティション化されたマテリアライズドビューを優先的に推奨するかどうか。この変数をtrueに設定すると、StarRocks はレンジパーティション化されたマテリアライズドビューを優先的に推奨します。この変数をfalseに設定すると、StarRocks はリストパーティション化されたマテリアライズドビューを推奨します。
automv_string_time_formats
- デフォルト: %Y%m%d,%Y-%m-%d
- 説明: 外部テーブルのパーティション列が日付値を持つ文字列型の場合の、その列の日付フォーマット。複数の値はカンマ(
,)で区切ります。StarRocks は、ここに列挙されたいずれかのフォーマットに基づいてパーティション列を DATE 型に変換し、レンジパーティション化されたマテリアライズドビューを推奨できます。どのフォーマットにも一致しない場合、推奨されるマテリアライズドビューはリストパーティション化を使用します。
例
例 1. クエリを Tunespace に追加し、クエリに名前を指定する
Tunespace ts1 に 3 つのクエリを追加し、クエリ名を Q1.1、Q1.2、Q1.3 と指定します。
CREATE TUNESPACE ts1;
ALTER TUNESPACE ts1 APPEND "Q1.1" SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25;
ALTER TUNESPACE ts1 APPEND "Q1.2" SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_yearmonthnum = 199401
AND lo_discount BETWEEN 4 and 6
AND lo_quantity BETWEEN 26 and 35;
ALTER TUNESPACE ts1 APPEND "Q1.3" SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_weeknuminyear = 6
AND d_year = 1994
AND lo_discount BETWEEN 5 AND 7
AND lo_quantity BETWEEN 26 AND 35;
ts1 のトップ 1 つの推奨を表示します。AcceleratedQueries フィールドは、Q1.1、Q1.2、Q1.3 を高速化できることを示しています。
SHOW RECOMMENDATIONS FROM ts1 LIMIT 1\G
Id: 0
Name: _mv_20240716T211252_3f05a0e6f04a36bd61254f443081acaa7b0633b4
RecommendedMV: CREATE MATERIALIZED VIEW _mv_20240716T211252_3f05a0e6f04a36bd61254f443081acaa7b0633b4 (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"storage_medium" = "HDD",
"replication_num" = "1"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(sum(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
HaltReason: OVERALL
TimeUsage: 1225
SamplingRatio: 1.0
CalcSteps: 8
CardQuality: EXCELLENT
RowCount: 6001215
Cardinality: 222697
CardRowCountRatio: 0.03710865216460334
Benefit: 5778518.0
NumQueriesAccelerated: 3
TotalBenefit: 1.7335554E7
AcceleratedQueries: ["Q1.1", "Q1.2", "Q1.3"]
例 2. クエリ名を指定せずに Tunespace にクエリを追加する
CREATE TUNESPACE ts2;
ALTER TUNESPACE ts2 APPEND SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25;
ALTER TUNESPACE ts2 APPEND SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_yearmonthnum = 199401
AND lo_discount BETWEEN 4 AND 6
AND lo_quantity BETWEEN 26 AND 35;
ALTER TUNESPACE ts2 APPEND SELECT sum(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_weeknuminyear = 6
AND d_year = 1994
AND lo_discount BETWEEN 5 AND 7
AND lo_quantity BETWEEN 26 AND 35;
システムは、Tunespace 内の ID を使用して各クエリに名前を自動生成します: id#1, id#100001, id#2。
SELECT id FROM ts2;
+--------+
| id |
+--------+
| 100001 |
| 2 |
| 1 |
+--------+
SHOW RECOMMENDATIONS FROM ts2 LIMIT 1\G
Id: 0
Name: _mv_20240716T211908_3f05a0e6f04a36bd61254f443081acaa7b0633b4
RecommendedMV: CREATE MATERIALIZED VIEW _mv_20240716T211908_3f05a0e6f04a36bd61254f443081acaa7b0633b4 (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"storage_medium" = "HDD",
"replication_num" = "1"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(sum(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
HaltReason: OVERALL
TimeUsage: 1248
SamplingRatio: 1.0
CalcSteps: 8
CardQuality: EXCELLENT
RowCount: 6001215
Cardinality: 222697
CardRowCountRatio: 0.03710865216460334
Benefit: 5778518.0
NumQueriesAccelerated: 3
TotalBenefit: 1.7335554E7
AcceleratedQueries: ["id#1", "id#100001", "id#2"]
例 3. レガシーマテリアライズドビューに基づいてマテリアライズドビューを推奨する
マテリアライズドビューの名前は、その中に含まれるクエリを表すために使用されます。
マテリアライズドビュー _mv_3f05a0e6f04a36bd61254f443081acaa7b0633b4 を作成します。
CREATE MATERIALIZED VIEW _mv_3f05a0e6f04a36bd61254f443081acaa7b0633b4 (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"storage_medium" = "HDD",
"replication_num" = "1"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(SUM(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum;
Q1.1、Q1.2、Q1.3 を Tunespace ts3 に追加します。
CREATE TUNESPACE ts3;
ALTER TUNESPACE ts3 APPEND "Q1.1" SELECT SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25;
ALTER TUNESPACE ts3 APPEND "Q1.2" SELECT SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_yearmonthnum = 199401
AND lo_discount BETWEEN 4 AND 6
AND lo_quantity BETWEEN 26 AND 35;
ALTER TUNESPACE ts3 APPEND "Q1.3" SELECT SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_weeknuminyear = 6
AND d_year = 1994
AND lo_discount BETWEEN 5 AND 7
AND lo_quantity BETWEEN 26 AND 35;
データベース ssb に作成したレガシーマテリアライズドビューで ts3 を埋めます。
ALTER TUNESPACE ts3 POPULATE FROM DATABASE ssb;
トップ 1 つの推奨されるマテリアライズドビューは、Q1.1、Q1.2、Q1.3 を高速化し、レガシーマテリアライズドビュー _mv_3f05a0e6f04a36bd61254f443081acaa7b0633b4 をマージできます。
SHOW RECOMMENDATIONS FROM ts3 LIMIT 1\G
Id: 0
Name: _mv_20240716T212706_3f05a0e6f04a36bd61254f443081acaa7b0633b4
RecommendedMV: CREATE MATERIALIZED VIEW _mv_20240716T212706_3f05a0e6f04a36bd61254f443081acaa7b0633b4 (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"storage_medium" = "HDD",
"replication_num" = "1"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(SUM(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
HaltReason: OVERALL
TimeUsage: 1193
SamplingRatio: 1.0
CalcSteps: 8
CardQuality: EXCELLENT
RowCount: 6001215
Cardinality: 222697
CardRowCountRatio: 0.03710865216460334
Benefit: 5778518.0
NumQueriesAccelerated: 4
TotalBenefit: 2.3114072E7
AcceleratedQueries: ["Q1.1", "Q1.2", "Q1.3", "_mv_3f05a0e6f04a36bd61254f443081acaa7b0633b4"]
例 4. 複雑なクエリのサブクエリに基づいてマテリアライズドビューを推奨する
複雑なクエリがマテリアライズドビュー推奨の対象外であっても、そのサブクエリが対象である場合、StarRocks はクエリのサブ構造を抽象化し、これらのサブ構造に基づいてマテリアライズドビューを推奨します。システムは各サブ構造に名前を自動生成します。
Q1.1、Q1.2、Q1.3 の UNION ALL クエリを追加します。
CREATE TUNESPACE ts4;
ALTER TUNESPACE ts4 APPEND "query"
SELECT "Q1.1" AS label, SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_year = 1993
AND lo_discount BETWEEN 1 AND 3
AND lo_quantity < 25
UNION ALL
SELECT "Q1.2" AS label, SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_yearmonthnum = 199401
AND lo_discount BETWEEN 4 AND 6
AND lo_quantity BETWEEN 26 AND 35
UNION ALL
SELECT "Q1.3" AS label, SUM(lo_revenue) AS revenue
FROM lineorder
JOIN dates ON lo_orderdate = d_datekey
WHERE d_weeknuminyear = 6
AND d_year = 1994
AND lo_discount BETWEEN 5 AND 7
AND lo_quantity BETWEEN 26 AND 35;
サブクエリの名前をクエリします。
SELECT id, traits->'name' FROM ts4;
+------+----------------+
| id | traits->'name' |
+------+----------------+
| 2 | "query.part.1" |
| 3 | "query.part.2" |
| 1 | "query.part.0" |
+------+----------------+
トップ 1 つの推奨されるマテリアライズドビューは、query.part.0、query.part.1、query.part.2 を高速化できます。
SHOW RECOMMENDATIONS FROM ts4 LIMIT 1\G
Id: 0
Name: _mv_20240716T213443_3f05a0e6f04a36bd61254f443081acaa7b0633b4
RecommendedMV: CREATE MATERIALIZED VIEW _mv_20240716T213443_3f05a0e6f04a36bd61254f443081acaa7b0633b4 (
lo_discount
, lo_quantity
, d_year
, d_weeknuminyear
, d_yearmonthnum
, _ca0003
)
COMMENT "MV recommended by AutoMV"
DISTRIBUTED BY HASH (lo_discount, lo_quantity, d_year, d_weeknuminyear, d_yearmonthnum) BUCKETS 64
ORDER BY (lo_discount, lo_quantity, d_year)
REFRESH ASYNC START("2023-12-01 10:00:00") EVERY(INTERVAL 1 DAY)
PROPERTIES (
"replicated_storage" = "true",
"storage_medium" = "HDD",
"replication_num" = "1"
)
AS
SELECT
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
,(SUM(_ta0000.lo_revenue)) AS _ca0003
FROM
(
SELECT
`ssb`.`dates`.d_year
,`ssb`.`dates`.d_yearmonthnum
,`ssb`.`dates`.d_weeknuminyear
,`ssb`.`lineorder`.lo_quantity
,`ssb`.`lineorder`.lo_discount
,`ssb`.`lineorder`.lo_revenue
FROM
`ssb`.`lineorder`
INNER JOIN
`ssb`.`dates`
ON (`ssb`.`lineorder`.lo_orderdate = `ssb`.`dates`.d_datekey)
) _ta0000
GROUP BY
_ta0000.lo_discount
,_ta0000.lo_quantity
,_ta0000.d_year
,_ta0000.d_weeknuminyear
,_ta0000.d_yearmonthnum
HaltReason: OVERALL
TimeUsage: 1237
SamplingRatio: 1.0
CalcSteps: 8
CardQuality: EXCELLENT
RowCount: 6001215
Cardinality: 222697
CardRowCountRatio: 0.03710865216460334
Benefit: 5778518.0
NumQueriesAccelerated: 3
TotalBenefit: 1.7335554E7
AcceleratedQueries: ["query.part.0", "query.part.1", "query.part.2"]