怎么判断图表查询是否命中物化以及如何排查没有命中物化的方法

1.如何判断当前图表查询是否命中物化视图?

1.1 在报告编辑状态下查看 SQL,点击图表右上角的更多选项查看 SQL,如果发现 SQL 中只查询了单表,或者表名很奇怪带了 “etl_” 前缀,那么一定是走了物化视图。

怎么判断图表查询是否命中物化以及如何排查没有命中物化的方法 - 图1

1.2 查看 websocket 接口返回数据,可以看下返回的数据结果里 ".result.extra.materialized" 字段,如果等于 1,说明命中了物化视图

怎么判断图表查询是否命中物化以及如何排查没有命中物化的方法 - 图2

2.如果没有命中物化视图如何排查定位?

可以在 backend 日志里查看 DC 模块的返回结果进行排查,这里列举几种没有命中的情况分别说明:

2.1 字段不存在的情况(fieldFail)

//这个表示查询的"类别"这个字段在物化视图里不存在
{
  "type": "fieldFail",
  "failExpr": "Field(1,类别,String,ExprMeta(None,None))",
  "expect": [
    [
      "Field(1,类别,String,ExprMeta(None,None))"
    ]
  ]
}

2.2 筛选范围不匹配(aggregateFail)

// 这个表示物化视图配置的 ds 字段的筛选范围 >= 2022-01-01 00:00:00
// 但是图表的筛选范围是 >= 2021-05-23 00:00:00
// 无法精确满足条件匹配,所以不能命中物化视图
{
  "type": "filterPredicateFail",
  "failExpr": "Date(Field(1,ds,String,ExprMeta(None,None)),ExprMeta(None,None))",
  "viewPredicate": "EComparePredicate(>=,LitStringV(2022-01-01 00:00:00))",
  "queryPredicate": "EComparePredicate(>=,LitStringV(2021-05-23 00:00:00))"
}

2.3 筛选器不存在的情况(filterExprNotMatchFail)

// 这个表示在物化视图里配置了一个订单日期的筛选器,但是图表查询上没有该筛选条件
// 也就是图表查询的数据范围比物化视图的范围大,自然命不中物化视图
// 这里如果筛选器字段类型转换的方式不一样也无法匹配
{
    "type": "filterExprNotMatchFail",
    "failExpr": "Date(Field(1,订单日期(YY-MM-DD),String,ExprMeta(None,None)),ExprMeta(None,None))"
}

2.4 聚合和明细不匹配(aggregateFail)

//如果物化视图是聚合的,但是查询的数据是明细,比如二维表的非聚合查询,那么这种情况下无法命中物化
{
  "type": "aggregateFail",
  "viewAgg": true,
  "queryAgg": false
}