
# Doris数据变更规范
该章节主要介绍Doris数据变更时需遵循的规范和建议。
#### 数据变更类
- 【强制】应用程序不可以直接使用delete或者update语句变更数据，可以使用CDC的upsert方式来实现。
  - 低频操作上使用，比如Update几分钟更新一次。
  
  - 如果使用Delete一定带上分区条件。
   
- 【强制】禁止使用INSERT INTO tbl1 VALUES ("1"), ("a");这种方式做数据导入，少量少次写可以，多量多频次时要使用Doris提供的StreamLoad、BrokerLoad、SparkLoad或者Flink Connector方式。
- 【建议】执行特殊的长SQL操作时，可以使用SELECT /\*+ SET_VAR(query_timeout = xxx\*/ from table类似这样通过Hint方式去设置Session会话变量，不要设置全局的系统变量。
 
- 【建议】不建议业务高峰期或在表上频繁地进行加减字段，建议在业务前期规划建表时预留将来要使用的字段。如果必须添加或删除字段，及修改字段类型和注释，需在业务低峰期，停止相关表的写入和修改业务后，通过重建表方式实现以上操作：
  1. 新建一个表，该表结构和需进行增删改字段的表结构相同。在新建表中增加需要添加的新字段、删除不需要的字段、或修改需改变类型的字段。
  
  2. 选取指定字段数据插入到新创建的表中：
     ```
     INSERT INTO 新创建的表 SELECT 指定的字段 FROM 已存在需要修改列的表;
     ```
     如果表数据量较大，可按时间过滤分批次将数据导入到新表，减小CPU或MEM内存瞬时冲高占用问题，影响查询业务，命令为：
     ```
     insert into tab1 select col from tab where date <= xx;
     ```
     
  
  3. 交换两个表的名称：
     ```
     ALTER TABLE [db.]tbl1 REPLACE WITH TABLE tbl2 [PROPERTIES('swap' = 'true')];
     ```
     
   
- 【强制】禁止在修改表结构时使用"重量级Schema Change"方式。触发重量级Schema Change的操作主要有两种：修改表列类型；以及修改、增加或删除表的Key列。遇到上述情况时，建议采用"新建目标表、将旧表数据迁移至新表、删除旧表"的方法，这种方式更为安全，且能更彻底地合并新表文件，提高查询性能。
 
