yangzhg commented on issue #7503:
URL: https://github.com/apache/doris/issues/7503#issuecomment-1160426843

   ## 缘起
   
   
现在物化视图能够支持在单表上创建,能够使用预计算的结果实现查询加速,但是对于多表场景的支持还不能实现,很多查询场景比较单一,数据更新频率不高的情况下,多表的物化视图能够有效的提升查询性能,减少数据的计算
   
   ## 竞品
   
   传统TP数据库ORACLE 和新兴AP数据库 CK 都支持
   
   oracle 
https://docs.oracle.com/cd/E11882_01/server.112/e10706/repmview.htm#REPLN003、
   
   CK https://clickhouse.com/docs/en/sql-reference/statements/create/view
   
   ## 语法
   
   ### 创建
   
   语法参照oracle 设计
   
   ```sql
   create materialized view mv_name          -- 1. 创建物化视图
   build [immediate | deferred]                                 -- 2. 创建方式,默认 
immediate
   refresh [fast | complete | never].        -- 3. 物化视图刷新方式,
   on [commit | demand]                                                     -- 
4. 刷新触发方式
   start with start_time                                              -- 5. 
设置开始时间
   next interval                                                      -- 6. 
设置间隔时间
   PARTITION BY [range|list]                 -- 7. 设置分区列
   DISTRIBUTED BY hash(cols..) BUCKETS 16    -- 8. 设置分桶
   PROPERTIES()                              -- 9. properties
   as                                         -- 10. 关键字
   select ...;                               -- 11. select 语句
   ```
   
   解释
   
   ```sql
   1. "build" -- 创建方式
        (1) 'immediate':立即生效,默认。
        (2) 'deferred' : 延迟至第一次 refresh 时才生效
   2. "refresh" 刷新方式
        (2) fast        :'快速刷新'。增量刷新
        (3) complete: '完全刷新'。刷新时更新全部数据,包括视图中已经生成的原有数据
        (4) never       : 从不刷新  
   3. "on" 触发方式 (on demand 中,才需要设置 '开始时间' 和 '间隔时间')
        (1) on commit:基表有 commit 动作时,刷新刷图("不能跨库执行")
        (2) on demand:在需要时刷新
                           [1] 根据后面设定的 '开始时间' 和 '结束时间' 进行刷新
                           [2] 手动调用进行刷新                        
   ```
   
   ### DESC
   
   ```sql
   DESCRIBE test_mv_view;
   ```
   
   ###  SHOW CREATE
   
   ```sql
   SHOW CREATE MATERIALIZED VIEW test_mv_view;
   ```
   
   ### DROP
   
   ```sql
   DROP MATERIALIZED VIEW test_mv_view;
   ```
   
   ### ALTER
   
   ```sql
   alter materialized view 物化视图名
   refresh [fast | complete | never]
   on [commit | demand]
   start with 开始时间
   next 间隔时间
   ```
   
   ### 刷新
   
   ```sql
   REFRESH MATERIALIZED VIEW test_mv_view [complete];
   ```
   
   ## 查询
   
   ```sql
   select .... from test_mv_view;
   ```
   
   可选 自动命中多表物化视图
   
   ## 实现
   
   ### 创建
   
   多表物化视图作为一种特殊类型表存在,本质上是一张表,所有管理和表一样,但是无法更新,无法导入, 在显示上和view 相同
   
   多表物化视图信息记录在 information_schema 库中 表中
   
   表结构如下
   
   ```sql
   +----------------------+------------+------+-------+---------+-------+
   | Field                | Type       | Null | Key   | Default | Extra |
   +----------------------+------------+------+-------+---------+-------+
   | TABLE_CATALOG        | VARCHAR(*) | Yes  | false | NULL    |       |
   | TABLE_SCHEMA         | VARCHAR(*) | Yes  | false | NULL    |       |
   | TABLE_NAME           | VARCHAR(*) | Yes  | false | NULL    |       |
   | VIEW_DEFINITION      | VARCHAR(*) | Yes  | false | NULL    |       |
   | CHECK_OPTION         | VARCHAR(*) | Yes  | false | NULL    |       |
   | IS_UPDATABLE         | VARCHAR(*) | Yes  | false | NULL    |       |
   | DEFINER              | VARCHAR(*) | Yes  | false | NULL    |       |
   | SECURITY_TYPE        | VARCHAR(*) | Yes  | false | NULL    |       |
   | CHARACTER_SET_CLIENT | VARCHAR(*) | Yes  | false | NULL    |       |
   | COLLATION_CONNECTION | VARCHAR(*) | Yes  | false | NULL    |       |
   | STATUS               | VARCHAR(*) | Yes  | false | NULL    |       |
   +----------------------+------------+------+-------+---------+-------+
   
   STATUS 字段表示当前物化视图状态,可选值 [Syncing|OutDate|UpToDate|Never|Error] 
在展示时检查物化视图的数据更新状态
   ```
   
   ### 更新
   
    根据刷新策略,在数据导入或者定时刷新数据。 如果数据不是最新的则根据条件更新,发出刷新数据命令同时转换成普通视图查询。也可以手动刷新,刷新命令本质上是 
insert into select ,在后台完成,同时将materialized_views 
中STATUS改成`Syncing`,同步完成后改成UpToDate
   
   ### 更改 
   
   在对表进行schema chang 时需要判断影响,是否需要更新多表物化视图
   
   ### 查询
   
   - 多表物化视图可以直接查询,如果可能也可以自动命中
   
   ### 其他
   
   - 多表物化视图在 on commit 更新时不适合 频繁更新的表


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to