
# ClickHouse Projection设计
![](https://support.huaweicloud.com/devg-rule-mrs/zh-cn_image_0000001529488394.png)
![](https://support.huaweicloud.com/devg-rule-mrs/public_sys-resources/note_3.0-zh-cn.png)
Projection仅在MRS 3.2.0及以上的版本集群中支持。
#### projection定义
```
CREATE TABLE test_projection_table(
    level String,
    type String,
    name String,
    city String,
    time DateTime64,
    PROJECTION projection_1(
        SELECT level,
            count()
        GROUP BY level
    ),
    PROJECTION projection_2(
        SELECT type,
            count()
        GROUP BY type
    )
) ENGINE = MergeTree()
ORDER BY (name, level, type)
```
#### 通过表属性修改方式创建projection
在创建好projection后还可以对projection进行修改，具体语句如下：
```
ALTER TABLE test_projection_table
ADD PROJECTION projection_3(
        SELECT type,
            level
        GROUP BY type,
            level
)
```
#### Projection的使用
- 如下SQL查询的时候会走表达式： **SELECT type, count() FROM test_projection_table WHERE type = 'A' GROUP BY type** **;**
  
- 而如下SQL不会走projection，因为city不在projection的定义中。 **SELECT city, count() FROM test_projection_table WHERE type = 'A' GROUP BY city;**
  
- 具体可以通过explain查看执行计划，如果出现ReadFromStorage (MergeTree(with projection))，表示命中projection。
 
#### 命中projection使用规则
- Where条件必须是Projection定义中Group By的子集。
- Group By必须是Projection定义中Group By的子集。
- Select必须是Projection定义中Select的子集。
- 多表join场景不支持Projection特性，此种场景建议用普通物化视图实现。
 
