
# SNAPSHOT
#### 功能描述
针对多用户情况下，对数据进行统一的版本控制。
#### 注意事项
- 本特性GUC参数db4ai_snapshot_mode，快照存储模型分为MSS和CSS两种；GUC参数db4ai_snapshot_version_delimiter，用于设定版本分隔符，仅接受设定单字节参数值，默认为"@";GUC参数db4ai_snapshot_version_separator，用于设定子版本分隔符，仅接受设定单字节参数值，默认为"."。
- 当快照选用增量存储方式时，各个快照中具有依赖关系。删除快照需要按照依赖顺序进行删除。
- snapshot特性用于团队不同成员间维护数据，涉及管理员和普通用户之间的数据转写。所以在三权分立(enableSeparationOfDuty=ON)等状态下，数据库不支持snapshot功能特性。
- 当需要稳定可用的快照用于AI训练等任务时，用户需要将快照发布。
 
#### 语法格式
1. 创建快照 可以采用"CREATE SNAPSHOT ... AS"以及"CREATE SNAPSHOT ... FROM"语句创建数据表快照。
   - CREATE SNAPSHOT AS
     ```
     CREATE SNAPSHOT qualified_name [@ [version]]
         [COMMENT IS comment_item]
         AS query;
     ```
     
   
   - CREATE SNAPSHOT FROM
     ```
     CREATE SNAPSHOT qualified_name [@ [version]]
         FROM @ version
         [COMMENT IS comment_item]
             USING (
             { INSERT [INTO SNAPSHOT] insert_item
               | UPDATE [SNAPSHOT] [AS alias] SET set_item [FROM from_item] [WHERE where_item]
               | DELETE [FROM SNAPSHOT] [AS alias] [USING using_item] [WHERE where_item]
               | ALTER [SNAPSHOT] { ADD and_item | DROP drop_item } [, ...]
           } [; ...]
         );
     ```
     
    
2. 删除快照。
   PURGE SNAPSHOT
   ```
   PURGE SNAPSHOT qualified_name @ version;
   ```
   
3. 快照采样。
   SAMPLE SNAPSHOT
   ```
   SAMPLE SNAPSHOT qualified_name @ version
       [STRATIFY BY attr_list]
       { AS alias AT RATIO num [COMMENT IS comment_item] } [, ...]
   ```
   
4. 快照发布。
   PUBLISH SNAPSHOT
   ```
   PUBLISH SNAPSHOT qualified_name @ version;
   ```
   
5. 快照存档。
   ARCHIVE SNAPSHOT
   ```
   ARCHIVE SNAPSHOT qualified_name @ version;
   ```
   
6. 查询快照。
   ```
   SELECT * FROM DB4AISHOT (qualified_name @ version );
   ```
   
 
#### 参数说明
- **qualified_name**
  创建snapshot的名称。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **version**
  (可省略)snapshot的版本号，当省略设置。系统会自动顺延编号。
  取值范围：字符串，数字编号配合分隔符。
  
- **comment_item**
  指定添加的评论内容。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **insert_item**
  需要插入的对象名字。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **alias**
  对当前对象取的别名。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **set_item**
  当前操作的对象名。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **from_item**
  用于连接的查询源对象的名称。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **where_item**
  返回值为布尔型的任意表达式。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **using_item**
  用于连接的对象名称。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **and_item**
  需要并列处理的对象名称。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **drop_item**
  需要drop的对象名称。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **attr_list**
  目标对象的list集合。
  取值范围：字符串，需要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0327.html#ZH-CN_TOPIC_0000002235339153__zh-cn_topic_0000002235101877_section1257443811315)。
  
- **num**
  指定的比例值。
  取值范围：数字。
  
 
#### 示例
```
——创建数据表
gaussdb=# CREATE TABLE t1 (id int, name varchar);
——插入数据
gaussdb=# INSERT INTO t1 VALUES (1, 'zhangsan');
gaussdb=# INSERT INTO t1 VALUES (2, 'lisi');
gaussdb=# INSERT INTO t1 VALUES (3, 'wangwu');
gaussdb=# INSERT INTO t1 VALUES (4, 'lisa');
gaussdb=# INSERT INTO t1 VALUES (5, 'jack');
——创建快照
gaussdb=# CREATE SNAPSHOT s1@1.0 comment is 'first version' AS SELECT * FROM t1;
——迭代创建快照
gaussdb=# CREATE SNAPSHOT s1@2.0 FROM @1.0 comment is 'inherits from @1.0' USING (INSERT VALUES(6, 'john'), (7, 'tim'); DELETE WHERE id = 1);
——查看快照内容
gaussdb=#SELECT * FROM DB4AISHOT(s1@1.0);
——快照采样
gaussdb=# SAMPLE SNAPSHOT s1@2.0 stratify by name as nick at ratio .5;
——删除快照
gaussdb=# PURGE SNAPSHOT s1@2.0;
gaussdb=# PURGE SNAPSHOT s1nick@2.0;
gaussdb=# PURGE SNAPSHOT s1@1.0;
——删除表格
gaussdb=# DROP TABLE t1;
```
