非同期マテリアライズドビューのトラブルシューティング
このトピックでは、非同期マテリアライズドビューを調査し、作業中に遭遇した問題を解決する方法について説明します。
注意
以下に示す機能の一部は、StarRocks v3.1以降でのみサポートされています。
非同期マテリアライズドビューの調査
作業中の非同期マテリアライズドビューの全体像を把握するために、まずその動作状態、リフレッシュ履歴、リソース消費を確認できます。
非同期マテリアライズドビューの動作状態を確認
非同期マテリアライズドビューの動作状態を確認するには、SHOW MATERIALIZED VIEWSを使用します。返される情報の中で、次のフィールドに注目できます。
is_active: マテリアライズドビューの状態がアクティブかどうか。アクティブなマテリアライズドビューのみがクエリアクセラレーションと書き換えに使用できます。last_refresh_state: 最後のリフレッシュの状態。PENDING、RUNNING、FAILED、SUCCESSがあります。last_refresh_error_message: 最後のリフレッシュが失敗した理由(マテリアライズドビューの状態がアクティブでない場合)。rows: マテリアライズドビュー内のデータ行数。この値は、実際の行数と異なる場合がありま す。更新が遅延することがあるためです。
他の返されるフィールドの詳細については、SHOW MATERIALIZED VIEWS - Returnsを参照してください。
例:
MySQL > SHOW MATERIALIZED VIEWS LIKE 'mv_pred_2'\G
***************************[ 1. row ]***************************
id | 112517
database_name | ssb_1g
name | mv_pred_2
refresh_type | ASYNC
is_active | true
inactive_reason | <null>
partition_type | UNPARTITIONED
task_id | 457930
task_name | mv-112517
last_refresh_start_time | 2023-08-04 16:46:50
last_refresh_finished_time | 2023-08-04 16:46:54
last_refresh_duration | 3.996
last_refresh_state | SUCCESS
last_refresh_force_refresh | false
last_refresh_start_partition |
last_refresh_end_partition |
last_refresh_base_refresh_partitions | {}
last_refresh_mv_refresh_partitions |
last_refresh_error_code | 0
last_refresh_error_message |
rows | 0
text | CREATE MATERIALIZED VIEW `mv_pred_2` (`lo_quantity`, `lo_revenue`, `sum`)
DISTRIBUTED BY HASH(`lo_quantity`, `lo_revenue`) BUCKETS 2
REFRESH ASYNC
PROPERTIES (
"replication_num" = "3",
"storage_medium" = "HDD"
)
AS SELECT `lineorder`.`lo_quantity`, `lineorder`.`lo_revenue`, sum(`lineorder`.`lo_tax`) AS `sum`
FROM `ssb_1g`.`lineorder`
WHERE `lineorder`.`lo_linenumber` = 1
GROUP BY 1, 2;
1 row in set
Time: 0.003s
非同期マテリアライズドビューのリフレッシュ履歴を表示
非同期マテリアライズドビューのリフレッシュ履歴を表示するには、データベース information_schema のテーブル task_runs をクエリします。返される情報の中で、次のフィールドに注目できます。
CREATE_TIMEとFINISH_TIME: リフレッシュタスクの開始と終了時間。STATE: リフレッシュタスクの状態。PENDING、RUNNING、FAILED、SUCCESSがあります。ERROR_MESSAGE: リフレッシュタスクが失敗した理由。
例:
MySQL > SELECT * FROM information_schema.task_runs WHERE task_name ='mv-112517' \G
***************************[ 1. row ]***************************
QUERY_ID | 7434cee5-32a3-11ee-b73a-8e20563011de
TASK_NAME | mv-112517
CREATE_TIME | 2023-08-04 16:46:50
FINISH_TIME | 2023-08-04 16:46:54
STATE | SUCCESS
DATABASE | ssb_1g
EXPIRE_TIME | 2023-08-05 16:46:50
ERROR_CODE | 0
ERROR_MESSAGE | <null>
PROGRESS | 100%
EXTRA_MESSAGE | {"forceRefresh":false,"mvPartitionsToRefresh":[],"refBasePartitionsToRefreshMap":{},"basePartitionsToRefreshMap":{}}
PROPERTIES | {"FORCE":"false"}
***************************[ 2. row ]***************************
QUERY_ID | 72dd2f16-32a3-11ee-b73a-8e20563011de
TASK_NAME | mv-112517
CREATE_TIME | 2023-08-04 16:46:48
FINISH_TIME | 2023-08-04 16:46:53
STATE | SUCCESS
DATABASE | ssb_1g
EXPIRE_TIME | 2023-08-05 16:46:48
ERROR_CODE | 0
ERROR_MESSAGE | <null>
PROGRESS | 100%
EXTRA_MESSAGE | {"forceRefresh":true,"mvPartitionsToRefresh":["mv_pred_2"],"refBasePartitionsToRefreshMap":{},"basePartitionsToRefreshMap":{"lineorder":["lineorder"]}}
PROPERTIES | {"FORCE":"true"}
非同期マテリアライズドビューのリソース消費を監視
リフレッシュ中およびリフレッシュ後の非同期マテリアライズドビューによるリソース消費を監視および分析できます。
リフレッシュ中のリソース消費を監視
リフレッシュタスク中に、そ のリアルタイムのリソース消費をSHOW PROC '/current_queries'を使用して監視できます。
返される情報の中で、次のフィールドに注目できます。
ScanBytes: スキャンされたデータのサイズ。ScanRows: スキャンされたデータ行数。MemoryUsage: 使用されたメモリのサイズ。CPUTime: CPU時間のコスト。ExecTime: クエリの実行時間。
例:
MySQL > SHOW PROC '/current_queries'\G
***************************[ 1. row ]***************************
StartTime | 2023-08-04 17:01:30
QueryId | 806eed7d-32a5-11ee-b73a-8e20563011de
ConnectionId | 0
Database | ssb_1g
User | root
ScanBytes | 70.981 MB
ScanRows | 6001215 rows
MemoryUsage | 73.748 MB
DiskSpillSize | 0.000
CPUTime | 2.515 s
ExecTime | 2.583 s
リフレッシュ後のリソース消費を分析
リフレッシュタスク後に、クエリプロファイルを通じてリソース消費を分析できます。クラスターのリーダー FE ノードの Web UI を通じて、マテリアライズドビューのフレッシュタスクのプロファイルを確認できます。
非同期マテリアライズドビューがリフレッシュされる際に、INSERT OVERWRITE ステートメントが実行されます。対応するクエリプロファイルを確認して、リフレッシュタスクによる時間とリソース消費を分析できます。
返される情報の中で、次のメトリクスに注目できます。
Total: クエリによる総消費時間。QueryCpuCost: クエリの総CPU時間コスト。CPU時間コストは同時プロセスに対して集計されます。その結果、このメトリックの値はクエリ の実際の実行時間よりも大きくなることがあります。QueryMemCost: クエリの総メモリコスト。- 個々のオペレーターに関する他のメトリクス、例えばジョインオペレーターや集計オペレーター。
クエリプロファイルの確認方法や他のメトリクスの理解についての詳細は、Analyze query profileを参照してください。
非同期マテリアライズドビューによるクエリの書き換えを確認
非同期マテリアライズドビューを使用してクエリが書き換えられるかどうかを、クエリプランから確認できます。EXPLAINを使用します。
クエリプランのメトリクス SCAN に対応するマテリアライズドビューの名前が表示されている場合、クエリはマテリアライズドビューによって書き換えられています。
例1:
MySQL > SHOW CREATE TABLE mv_agg\G
***************************[ 1. row ]***************************
Materialized View | mv_agg
Create Materialized View | CREATE MATERIALIZED VIEW `mv_agg` (`c_custkey`)
DISTRIBUTED BY RANDOM
REFRESH ASYNC
PROPERTIES (
"replication_num" = "3",
"replicated_storage" = "true",
"storage_medium" = "HDD"
)
AS SELECT `customer`.`c_custkey`
FROM `ssb_1g`.`customer`
GROUP BY `customer`.`c_custkey`;
MySQL > EXPLAIN LOGICAL SELECT `customer`.`c_custkey`
-> FROM `ssb_1g`.`customer`
-> GROUP BY `customer`.`c_custkey`;
+-----------------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------------+
| - Output => [1:c_custkey] |
| - SCAN [mv_agg] => [1:c_custkey] |
| Estimates: {row: 30000, cpu: ?, memory: ?, network: ?, cost: 15000.0} |
| partitionRatio: 1/1, tabletRatio: 12/12 |
| 1:c_custkey := 10:c_custkey |
+-----------------------------------------------------------------------------------+
クエリの書き換え機能を無効にすると、StarRocksは通常のクエリプランを採用します。
例2:
MySQL > SET enable_materialized_view_rewrite = false;
MySQL > EXPLAIN LOGICAL SELECT `customer`.`c_custkey`
-> FROM `ssb_1g`.`customer`
-> GROUP BY `customer`.`c_custkey`;
+---------------------------------------------------------------------------------------+
| Explain String |
+---------------------------------------------------------------------------------------+
| - Output => [1:c_custkey] |
| - AGGREGATE(GLOBAL) [1:c_custkey] |
| Estimates: {row: 15000, cpu: ?, memory: ?, network: ?, cost: 120000.0} |
| - SCAN [mv_bitmap] => [1:c_custkey] |
| Estimates: {row: 60000, cpu: ?, memory: ?, network: ?, cost: 30000.0} |
| partitionRatio: 1/1, tabletRatio: 12/12 |
+---------------------------------------------------------------------------------------+
問題の診断と解決
ここでは、非同期マテリアライズドビューを使用中に遭遇する可能性のある一般的な問題と、それに対応する解決策をいくつか紹介します。
マテリアライズドビューの構築失敗
非同期マテリアライズドビューの作成に失敗した場合、つまりCREATE MATERIALIZED VIEWステートメントが実行できない場合、次の点を確認できます。
-
同期マテリアライズドビュー用のSQLステートメントを誤って使用していないか確認する。
StarRocksは、同期マテリアライズドビューと非同期マテリアライズドビューの2種類のマテリアライズドビューを提供しています。
同期マテリアライズドビューを作成するために使用される基本的なSQLステートメントは次のとおりです。
CREATE MATERIALIZED VIEW <mv_name>
AS <query>しかし、非同期マテリアライズドビューを作成するために使用されるSQLステートメントには、より多くのパラメータが含まれています。
CREATE MATERIALIZED VIEW <mv_name>
REFRESH ASYNC -- 非同期マテリアライズドビューのリフレッシュ戦略。
DISTRIBUTED BY HASH(<column>) -- 非同期マテリアライズドビューのデータ分散戦略。
AS <query>SQLステートメントに加えて、2つのマテリアライズドビューの主 な違いは、非同期マテリアライズドビューはStarRocksが提供するすべてのクエリ構文をサポートしますが、同期マテリアライズドビューは限られた集計関数の選択肢のみをサポートすることです。
-
正しいパーティション列を指定しているか確認する。
非同期マテリアライズドビューを作成する際に、パーティショニング戦略を指定できます。これにより、より細かい粒度レベルでマテリアライズドビューをリフレッシュできます。
現在、StarRocksはレンジパーティション化のみをサポートしており、マテリアライズドビューを構築するために使用されるクエリステートメントのSELECT式から単一の列を参照することのみをサポートしています。date_trunc()関数を使用して列を切り捨て、パーティショニング戦略の粒度レベルを変更できます。他の式はサポートされていないことに注意してください。
-
マテリアライズドビューを作成するための必要な権限を持っているか確認する。
非同期マテリアライズドビューを作成する際に、クエリされるすべてのオブジェクト(テーブル、ビュー、マテリアライズドビュー)のSELECT権限が必要です。クエリでUDFが使用されている場合、関数のUSAGE権限も必要です。