异步物化视图故障排除
本文介绍了如何检查您的异步物化视图,并解决在使用时遇到的问题。
注意
以下展示的部分功能仅在 StarRocks v3.1 及以后的版本中支持。
检查异步物化视图
为了全面了解您正在使用的异步物化视图,您可以首先 检查它们的工作状态、刷新历史和资源消耗情况。
检查异步物化视图工作状态
您可以使用 SHOW MATERIALIZED VIEWS 命令来检查异步物化视图的工作状态。在返回的所有信息中,您可以关注以下字段:
is_active
:物化视图的状态是否为 Active 状态。只有处于 Active 状态的物化视图才能用于查询加速和改写。last_refresh_state
:最近一次刷新的状态,包括 PENDING(等待中)、RUNNING(运行中)、FAILED(失败)和 SUCCESS(成功)。last_refresh_error_message
:上次刷新失败的原因(如果物化视图状态不为 Active 状态)。rows
:物化视图中的数据行数。请注意,这个值可能与物化视图的实际行数不同,因为更新可能有延迟。
有关返回的其他字段的详细信息,请参阅 SHOW MATERIALIZED VIEWS - 返回。
示例:
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
刷新任务完成后分析资源消耗
在刷新任务完成后,您可以通过 Query Profile 来分析其资源消耗情况。
当异步物化视图正在刷新时,会执行 INSERT OVERWRITE 语句。您可以检查相应的 Query Profile,以分析刷新任务所消耗的时间和资源。
在返回的所有信息中,您可以关注以下指标:
Total
:查询消耗的总时间。QueryCpuCost
:查询的总 CPU 时间成本。CPU 时间成本会对并发进程进行聚合。因此,该指标的值可能大于查询的实际执行时间。QueryMemCost
:查询的总内存成本。- 其他针对各个运算符的特定指标,比如连接运算符和聚合运算符。
有关如何分析 Query Profile 和理解其他指标的详细信息,请参阅 查看分析 Query Profile.
验证查询是否被异步物化视图改写
您可以通过使用 EXPLAIN 查看查询计划,以检查查询是否可以被异步物化视图重写。
如果查询计划中的 SCAN
指标显示了相应物化视图的名称,那么该查询已经被物化视图重写。
示例一:
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 将采用常规的查询计划。
示例二:
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 提供了两种不同的物化视图:同步物化视图和异步物化视图。
创建同步物化视图时使用的基本 SQL 语句如下:
CREATE MATERIALIZED VIEW <mv_name>
AS <query>与之相比,创建异步物化视图时使用的 SQL 语句包含更多参数:
CREATE MATERIALIZED VIEW <mv_name>
REFRESH ASYNC -- 异步物化视图的刷新策略。
DISTRIBUTED BY HASH(<column>) -- 异步物化视图的数据分布策略。
AS <query>