4.3.1 Delete 操作¶
Delete
操作语句通过 MySQL
协议,对指定的 table
或者 partition
中的数据进行按条件删除。 Delete
删除操作不同于基于导入的批量删除,它类似 Insert into
语句,是一个同步过程。所有的 Delete
操作在 Doris
中是一个独立的导入作业,一般 Delete
语句需要指定表和分区以及删除的条件来筛选要删除的数据,并将会同时删除 base
表和 rollup
表的数据。
Delete
操作的语法详见 DELETE
语法。不同于 Insert into
命令, delete
不能手动指定 label
,有关 label
的概念可以查看 Insert Into
文档。
1 通过指定过滤谓词来删除¶
SQL | |
---|---|
1 2 3 |
|
1.1 必须的参数¶
-
table_name
:指定需要删除数据的表 -
column_name
:属于table_name
的列 -
op
:逻辑比较操作符,可选类型包括:=
,>
,<
,>=
,<=
,!=
,in
,not in
-
value | value_list
:做逻辑比较的值或值列表
1.2 可选的参数¶
-
PARTITION partition_name | PARTITIONS (partition_name [, partition_name])
:指定执行删除数据的分区名,如果表不存在此分区,则报错 -
table_alias
:表的别名
1.3 注意事项¶
-
使用表模型
Aggregate
时,只能指定Key
列上的条件。 -
当选定的
Key
列不存在于某个Rollup
中时,无法进行Delete
。 -
条件之间只能是“与”的关系。若希望达成“或”的关系,需要将条件分写在两个
DELETE
语句中; -
如果为分区表,需要指定分区,如果不指定,
Doris
会从条件中推断出分区。两种情况下,Doris
无法从条件中推断出分区: -
条件中不包含分区列;
-
分区列的
op
为not in
。当分区表未指定分区,或者无法从条件中推断分区的时候,需要设置会话变量delete_without_partition
为true
,此时Delete
会应用到所有分区。 -
该语句可能会降低执行后一段时间内的查询效率。影响程度取决于语句中指定的删除条件的数量。指定的条件越多,影响越大。
1.4 使用示例¶
-
删除
my_table partition p1
中k1
列值为3
的数据行SQL 1 2
DELETE FROM my_table PARTITION p1 WHERE k1 = 3;
-
删除
my_table partition p1
中k1
列值大于等于3
且k2
列值为"abc"
的数据行SQL 1 2
DELETE FROM my_table PARTITION p1 WHERE k1 = 3 AND k2 = "abc";
-
删除
my_table partition p1, p2
中k1
列值大于等于3
且k2
列值为"abc"
的数据行SQL 1 2
DELETE FROM my_table PARTITIONS (p1, p2) WHERE k1 = 3 AND k2 = "abc";
2 通过使用 Using 子句来删除¶
SQL | |
---|---|
1 2 3 4 |
|
2.1 必须的参数¶
-
table_name
:指定需要删除数据的表 -
WHERE condition
:指定一个用于选择删除行的条件
2.2 可选的参数¶
-
PARTITION partition_name | PARTITIONS (partition_name [, partition_name])
:指定执行删除数据的分区名,如果表不存在此分区,则报错 -
table_alias
:表的别名
2.3 注意事项¶
此种形式只能在 UNIQUE KEY
模型表上使用
- 只能在表模型
UNIQUE Key
表模型上使用,只能指定key
列上的条件。
2.4 使用示例¶
使用 t2
和 t3
表连接的结果,删除 t1
中的数据,删除的表只支持 unique
模型
SQL | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
预期结果为,删除了 t1
表 id
为 1
的列
SQL | |
---|---|
1 2 3 4 5 6 |
|
3 结果返回¶
Delete
命令是一个 SQL
命令,返回结果是同步的,分为以下几种:
3.1 执行成功¶
如果 Delete
顺利执行完成并可见,将返回下列结果, Query OK
表示成功
SQL | |
---|---|
1 2 3 |
|
3.2 提交成功,但未可见¶
Doris
的事务提交分为两步:提交和发布版本,只有完成了发布版本步骤,结果才对用户是可见的。若已经提交成功了,那么就可以认为最终一定会发布成功, Doris
会尝试在提交完后等待发布一段时间,如果超时后即使发布版本还未完成也会优先返回给用户,提示用户提交已经完成。若如果 Delete
已经提交并执行,但是仍未发布版本和可见,将返回下列结果
SQL | |
---|---|
1 2 3 |
|
结果会同时返回一个 json
字符串:
-
affected rows
:表示此次删除影响的行,由于Doris
的删除目前是逻辑删除,因此对于这个值是恒为0
; -
label
:自动生成的label
,是该导入作业的标识。每个导入作业,都有一个在单Database
内部唯一的Label
; -
status
:表示数据删除是否可见,如果可见则显示VISIBLE
,如果不可见则显示COMMITTED
; -
txnId
:这个Delete job
对应的事务id
; -
err
:字段会显示一些本次删除的详细信息。
3.3 提交失败,事务取消¶
如果 Delete
语句没有提交成功,将会被 Doris
自动中止,返回下列结果
SQL | |
---|---|
1 2 |
|
比如说一个超时的删除,将会返回 timeout
时间和未完成的( tablet=replica
)
SQL | |
---|---|
1 2 |
|
3.4 总结¶
对于 Delete
操作返回结果的正确处理逻辑为:
-
如果返回结果为
ERROR 1064 (HY000)
,则表示删除失败; -
如果返回结果为
Query OK
,则表示删除执行成功;-
如果
status
为COMMITTED
,表示数据仍不可见,用户可以稍等一段时间再用show delete
命令查看结果; -
如果
status
为VISIBLE
,表示数据删除成功。
-
4 相关 FE 配置¶
4.1 TIMEOUT 配置¶
总体来说, Doris
的删除作业的超时时间计算规则为如下(单位:秒):
SQL | |
---|---|
1 |
|
-
tablet_delete_timeout_second
Delete
自身的超时时间是受指定分区下Tablet
的数量弹性改变的,此项配置为平均一个Tablet
所贡献的timeout
时间,默认值为2
。假设此次删除所指定分区下有
5
个tablet
,那么可提供给delete
的timeout
时间为10
秒,由于低于最低超时时间30
秒,因此最终超时时间为30
秒。 -
query_timeout
因为
Delete
本身是一个SQL
命令,因此删除语句也会受Session
限制,timeout
还受Session
中的query_timeout
值影响,可以通过SET query_timeout = xxx
来增加超时时间,单位是秒。
4.2 IN 谓词配置¶
-
max_allowed_in_element_num_of_delete
如果用户在使用
in
谓词时需要占用的元素比较多,用户可以通过此项调整允许携带的元素上限,默认值为1024
。
5 查看历史记录¶
用户可以通过 show delete
语句查看历史上已执行完成的删除记录。
语法如下
SQL | |
---|---|
1 |
|
使用示例
SQL | |
---|---|
1 2 3 4 5 6 7 8 |
|