メインコンテンツまでスキップ

自動マテリアライズドビュー推奨

このトピックでは、自動マテリアライズドビュー推奨機能を活用して、ビジネスシナリオでクエリを高速化するために使用できるマテリアライズドビューのスキーマを生成する方法について説明します。

概要

CelerData の非同期マテリアライズドビューは、SPJG(select-project-join-group-by)形式に基づく広く採用されている透過的なクエリの書き換えアルゴリズムを使用しています。これにより、計算コストを大幅に削減し、クエリの実行を大幅に高速化できます。しかし、マテリアライズドビューの設計は難しく、ユーザーはクエリの書き換えと高速化に適したマテリアライズドビューを設計するために多くの努力を費やす必要があります。さらに、ビジネスシナリオが変わるたびにマテリアライズドビューを再設計する必要があり、時間と労力の大きなコストが発生します。

これらの問題に対処するために、CelerData は v3.3.2 で自動マテリアライズドビュー推奨機能を導入しました。ビジネスシナリオのクエリステートメントを Tunespace に追加するだけで、これらのクエリを書き換え、高速化できるコスト効率の良いマテリアライズドビューのスキーマを簡単に取得できます。システムはクエリを解析し、その構造とクエリの書き換えに利用可能な SPJG パターンを抽象化し、情報に基づいて適切なマテリアライズドビュースキーマを計算することで、マテリアライズドビューを自動的に推奨します。これらの構造、パターン、およびクエリの他のメタデータは「Tunespace」を形成します。また、レガシーマテリアライズドビューを Tunespace に追加することもできます。システムはマテリアライズドビューを解析し、Tunespace 内のクエリを高速化できる場合、またはいくつかのマテリアライズドビューを1つにマージできる場合にスキーマを推奨します。マテリアライズドビューをマージすることで、マテリアライズドビューの数を減らし、それに伴うリフレッシュとストレージのコストを削減できます。Tunespace にレコードを追加または削除するたびに、システムは推奨を自動的に更新し、レガシーマテリアライズドビューの再設計の手間を解消します。

使用方法

ステップ 1. Tunespace を作成する

構文:

CREATE TUNESPACE [IF NOT EXISTS] <tunespace_name>

tunespace_name: 作成する Tunespace の名前。

例:

CREATE TUNESPACE test_ts;

注意

Tunespace は本質的に SQL 操作を許可する通常のテーブルです。

ステップ 2. クエリを Tunespace に追加する

クエリが Tunespace に追加されると、システムはクエリステートメントを解析し、Tunespace にクエリの SPJG 構造とメタデータを記録します。オプションで各クエリに名前を割り当てることができ、推奨されるマテリアライズドビューによって高速化できるクエリを表すために使用されます。

構文:

ALTER TUNESPACE <tunespace_name> APPEND ["query_name"] <query_statement>
  • tunespace_name: Tunespace の名前。
  • query_name: (オプション)追加するクエリの名前。クエリ名はダブルクォーテーションで囲む必要があります。
  • query_statement: 追加するクエリ。

例:

-- クエリを test_ts に追加し、クエリ名を 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;


-- クエリ名を指定せずにクエリを test_ts に追加します。
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 に追加されると、システムはそれを解析し、その構造とメタデータを Tunespace に記録します。レガシーマテリアライズドビューは、Tunespace に記録されたクエリを高速化できる場合に推奨されるか、適格な場合にレガシーマテリアライズドビューをマージするマテリアライズドビューのスキーマを推奨します。マテリアライズドビューがどのようにマージされるかの詳細については、マテリアライズドビューマージを参照してください。

データベースまたは別の Tunespace からレガシーマテリアライズドビューで Tunespace を埋めることができます。

構文:

-- データベース内のレガシーマテリアライズドビューで Tunespace を埋める。
ALTER TUNESPACE <tunespace_name> POPULATE FROM DATABASE <database_name>

-- 別の Tunespace からレガシーマテリアライズドビューで Tunespace を埋める。
ALTER TUNESPACE <tunespace_name> POPULATE FROM TUNESPACE <source_tunespace_name>
  • tunespace_name: Tunespace の名前。
  • database_name: Tunespace を埋めるために使用されるマテリアライズドビューを持つデータベースの名前。
  • source_tunespace_name: 現在の Tunespace を埋めるために使用されるマテリアライズドビューを持つソース Tunespace の名前。

例:

-- データベース ssb 内のレガシーマテリアライズドビューで Tunespace を埋める。
ALTER TUNESPACE test_ts POPULATE FROM DATABASE ssb;

-- 別の Tunespace src_ts からレガシーマテリアライズドビューで Tunespace を埋める。
ALTER TUNESPACE test_ts POPULATE FROM TUNESPACE src_ts;

ステップ 4. マテリアライズドビューの推奨を表示する

クエリとレガシーマテリアライズドビューが Tunespace に追加されると、システムは推奨されるマテリアライズドビューのスキーマを自動的に計算します。SHOW RECOMMENDATIONS ステートメントを実行することで、推奨されるマテリアライズドビュースキーマを表示できます。

構文:

SHOW RECOMMENDATIONS FROM <tunespace_name> [LIMIT <INT>] [OFFSET <INT>]

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;

マテリアライズドビューマージ

システムが Tunespace 内のクエリに対してマテリアライズドビューを推奨する際、各クエリを論理的なフラットテーブル上の集計クエリとして扱います。同じ論理的なフラットテーブル上の集計クエリを持つ異なるマテリアライズドビューは、1 つのマテリアライズドビューにマージできます。システムは集計クエリの構造を自動的に解析し、論理的なフラットテーブルを推測します。これは完全に仮想的なテーブルであり、メタデータには作成または記録されません。

システムは 2 つの異なる方法でマテリアライズドビューをマージします: 統合とカバーリング。

  • 統合は、2 つのマテリアライズドビューが同じ次元列を共有している場合に使用されます。マージ後のマテリアライズドビューの次元列は、元のマテリアライズドビューの次元列であり、メトリック列は 2 つのマテリアライズドビューのメトリック列の和集合です。

    次の例では、Q3 は Q1 と Q2 の統合です:

    -- Q1
    select d0, d1, d2, sum(v0), count(v1)
    from t0 inner join t1 on t0.c0 = t1.c1
    group by d0,d1,d2;

    -- Q2
    select d0, d1, d2, max(v2), min(v3)
    from t0 inner join t1 on t0.c0 = t1.c1
    group by d0,d1,d2;

    -- Q3
    select d0, d1, d2,sum(v0), count(v1)max(v2), min(v3)
    from t0 inner join t1 on t0.c0 = t1.c1
    group by d0,d1,d2;
  • カバーリングは、2 つのマテリアライズドビューの次元列が異なる場合に使用されます。マージ後のマテリアライズドビューの次元列は、元のマテリアライズドビューの次元列の和集合であり、メトリック列も同様です。

    次の例では、Q6 は Q4 と Q5 のカバーリングです:

    -- Q4
    select d0, d1, sum(v0), count(v1)
    from t0 inner join t1 on t0.c0 = t1.c1
    group by d0,d1

    -- Q5
    select d1, d2, max(v2), min(v3)
    from t0 inner join t1 on t0.c0 = t1.c1
    group by d1,d2;

    -- Q6
    select d0, d1, d2,sum(v0), count(v1)max(v2), min(v3)
    from t0 inner join t1 on t0.c0 = t1.c1
    group 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_estimationtrue に設定する必要があります。
動機マテリアライズドビューの数とそれらをリフレッシュするコストを削減するため理論的には、レガシーマテリアライズドビューとマージされたものの両方がクエリを高速化できます。ただし、マージされたマテリアライズドビューを使用してクエリを書き換える際には追加のロールアップ操作が必要です。その高速化効果はレガシーのものよりも優れていません。ただし、マージはマテリアライズドビューの数とそれらをリフレッシュおよび保存するコストを削減できます。
良いケースすべてのケースが良いケースです。カバーリングには2種類の良いケースがあります。
2つのレガシーマテリアライズドビューがあると仮定します: mv0(次元列 d0d1d2 を持つ)と mv1(次元列 d0d1d3 を持つ)。それらは mv(次元列 d0d1d2d3 を持つ)にマージされます。マージ後の mv のカーディナリティがマージ前の mv0mv1 と同等である場合、カバーリングは最も効率的です。マージ後の mv のカーディナリティがマージ前の mv0mv1 に非常に近い場合も良いケースです。たとえば、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_ratioautomv_card_rowcount_ratio_lwm 未満の場合、マテリアライズドビューは低コストと見なされ、直接推奨リストに追加されます。
    • card_rowcount_ratioautomv_card_rowcount_ratio_hwm を超える場合、マテリアライズドビューは高コストと見なされ、破棄されます。
    • card_rowcount_ratioautomv_card_rowcount_ratio_lwmautomv_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 以上の場合にのみ適用されます。パーティション述語は同一である必要はありません。システムは包括的な範囲を計算します。たとえば、次のように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' のような時間関数を含む述語はサポートされていません。

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
  • 説明: マテリアライズドビューにパーティション化に使用できる次元列がある場合、この列が優先的にパーティション列として使用されます。マテリアライズドビューの次元列がパーティション列として使用できず、マテリアライズドビュー内のすべてのメトリック列がロールアップのために書き換え可能な場合、推奨アルゴリズムはベーステーブルのパーティション列をマテリアライズドビューの次元列にデフォルトのパーティション列として追加しようとします。このパラメータは、マテリアライズドビューのデフォルトのパーティショニング粒度を設定するために使用されます。有効な値は yearquartermonthdayhour、および none(デフォルトのパーティション列補完ロジックを無効にすることを示す)です。現在、レンジパーティション化のみがサポートされています。リストパーティション化はサポートされていません。

例 1. クエリを Tunespace に追加し、クエリに名前を指定する

Tunespace ts1 に3つのクエリを追加し、クエリ名を Q1.1Q1.2Q1.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.1Q1.2Q1.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 にクエリを追加する

```Plain
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` を作成します。

```Plain
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.1Q1.2Q1.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.1Q1.2Q1.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. 複雑なクエリのサブクエリに基づいてマテリアライズドビューを推奨する

複雑なクエリがマテリアライズドビュー推奨の対象外であっても、そのサブクエリが対象である場合、システムはクエリのサブ構造を抽象化し、これらのサブ構造に基づいてマテリアライズドビューを推奨します。システムは各サブ構造に名前を自動生成します。

`Q1.1`、`Q1.2`、`Q1.3` の UNION ALL クエリを追加します。

```Plain
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.0query.part.1query.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"]