Skip to content

Commit

Permalink
update sql docs
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Feb 6, 2025
1 parent d05cb43 commit 2a7ee42
Showing 1 changed file with 34 additions and 3 deletions.
37 changes: 34 additions & 3 deletions docs/olap/01.OLAP概述.md
Original file line number Diff line number Diff line change
Expand Up @@ -696,7 +696,7 @@ Mesa 为了解决上面提到的两个问题,提出了一个预聚合的存储

## 物化视图

物化视图是一种预先计算并存储的数据库对象,它基于基础表的数据生成。它类似于普通视图,但普通视图只是逻辑定义(不存储数据),而 **物化视图会将查询结果实际存储在磁盘上**
物化视图是一种预先计算并存储的数据库对象,它基于基础表的数据生成。它类似于普通视图,但普通视图只是逻辑定义(不存储数据),而 **物化视图会将查询结果实际存储在磁盘上,对于客户端(client)来说,物化视图就像是一个只读的表。这个表的数更新是根据基表的更新来维护的。**


| 特性 | 普通视图(View) | 物化视图(Materialized View) |
Expand Down Expand Up @@ -747,6 +747,27 @@ Mesa 为了解决上面提到的两个问题,提出了一个预聚合的存储



**增量更新的原理**:物化视图增量更新(IVM)的核心在于"增量",仅处理自上次更新以来的数据变动,避免重新计算整个视图,显著降低计算和时间开销。通过捕获并计算增量数据,它能高效维护最新数据结果,在实时数据分析、报表生成和数据同步等场景中,成为提升查询性能、减少存储开销的不可或缺工具。


(1) 变更捕获
增量更新的核心在于捕获基础表中的变更数据。常见的方法包括:
- 事务日志解析 :解析数据库的事务日志(如 Redo Log 或 Write-Ahead Log),提取新增、修改或删除的记录。
- 触发器 :在基础表上定义触发器,将变更记录写入一个辅助表(Change Log Table)。
- 时间戳或版本号 :通过时间戳或版本号标记记录的更新状态。

(2) 差异计算
根据捕获的变更数据,计算对物化视图的影响:
- 如果某条记录被插入到基础表中,则将其加入物化视图。
- 如果某条记录被修改,则更新物化视图中对应的聚合值。
- 如果某条记录被删除,则从物化视图中移除相应的结果。


(3) 更新物化视图
将计算出的差异应用到物化视图中,完成增量更新。





**物化视图查询改写和透明加速**
Expand Down Expand Up @@ -845,6 +866,8 @@ COMMENT ON COLUMN DB_QHDATA_MACRO.macro_index_data.area_code_type IS '区划代
COMMENT ON TABLE DB_QHDATA_MACRO.macro_index_data IS '宏观指标数据表';




-- 如果对这个表经常进行这类查询
SELECT
OCCUR_PERIOD,SUM(index_value)
Expand All @@ -867,11 +890,19 @@ FROM DB_QHDATA_MACRO.macro_index_data
GROUP BY index_code, dim_extra, OCCUR_PERIOD
ORDER BY index_code, dim_extra, OCCUR_PERIOD DESC;

-- 在原始查询中,index_code 和 dim_extra 是动态参数(用 ? 表示)。为了支持任意组合的查询,物化视图需要包含所有可能的 index_code 和 dim_extra 组合。
-- 在原始查询中,index_code 和 dim_extra 是动态参数(用 ? 表示)。为了支持任意组合的查询,物化视图需要包含所有可能的(index_code,dim_extra,OCCUR_PERIOD) 组合。在物化视图 mv_macro_index_data_summary,能够显著提升涉及 index_code 和 dim_extra 过滤条件的查询性能。预计算按照三个字段分组后的聚合数据



SELECT
OCCUR_PERIOD,SUM(index_value)
FROM DB_QHDATA_MACRO.macro_index_data
WHERE index_code='gmjj_gnmy_01' AND dim_extra='CITY_TARGET'
GROUP BY OCCUR_PERIOD ORDER BY occur_period DESC;

-- 在物化视图 mv_macro_index_data_summary,能够显著提升涉及 index_code 和 dim_extra 过滤条件的查询性能。预计算按照三个字段分组后的聚合数据


-- 通常,单表查询基本用不上这种 MV,还不如直接针对一些关键字段添加索引来的高效,这个例子只是为了演示这种预计算的效果。

```

Expand Down

0 comments on commit 2a7ee42

Please sign in to comment.