自動マテリアライズドビュー推奨
このトピックでは、自動マテリアライズドビュー推奨機能を活用して、ビジネスシナリオでクエリを高速化するために使用できるマテリアライズドビューのスキーマを生成する方法について説明します。
概要
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_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 句がない場合、この変数は効果を発揮しません。