本文介紹如何在云數據庫 SelectDB 版實例中,通過DELETE命令刪除數據。
概述
DELETE不同于其他導入方式,它是一個同步過程,與INSERT INTO相似。所有的DELETE操作在SelectDB中是一個獨立的導入作業。通常DELETE語句需要指定表和分區以及刪除的條件來篩選要刪除的數據,并會同時刪除BASE表和ROLLUP表的數據。
使用方式
該語句用于按條件刪除指定Table及其ROLLUP中的數據。
語法
DELETE FROM table_name [PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
WHERE
column_name op { value | value_list } [ AND column_name op { value | value_list } ...];
參數說明
參數名稱 | 參數說明 |
table_name | 指定需要刪除數據的表。 |
PARTITION partition_name | PARTITIONS (partition_name[, partition_name]) | 可選參數。指定執行刪除數據的分區名,如果表不存在此分區,則報錯。 |
column_name | 指定需要刪除數據的表的列名。 |
op | 邏輯比較操作符,可選類型包括: |
value | value_list | 做邏輯比較的值或值列表。 |
使用聚合類的表模型(AGGREGATE、UNIQUE)只能指定Key列上的條件。
若選定的Key列不存在于某個物化視圖或ROLLUP中,則無法進行DELETE。
條件之間只能是“與”的關系。若希望達成“或”的關系,需要將條件分寫在兩個DELETE語句中。
如果為分區表,刪除時需要指定分區。如果不指定,SelectDB會從條件中推斷出分區。當分區表未指定分區,或者無法從條件中推斷分區的時,需要設置Session變量
delete_without_partition
為 true。# 當前Session set delete_without_partition = true; # 全局 set global delete_without_partition = true;
此時DELETE會應用到所有分區。以下兩種情況會使SelectDB無法從條件中推斷出分區。
條件中不包含分區列。
分區列的op為not in。
DELETE語句可能會降低執行后一段時間內的查詢效率。影響程度取決于語句中指定的刪除條件的數量。指定的條件越多,影響越大。
不同于Insert into命令,DELETE不能手動指定
label
。
返回結果
DELETE命令是一個SQL命令,返回結果是同步的,分為以下三種。
執行成功
DELETE順利執行完成并可見,將返回如下結果,Query OK
表示成功。
DELETE FROM test_tbl PARTITION p1 WHERE k1 = 1;
Query OK, 0 rows affected (0.04 sec)
{'label':'delete_e7830c72-eb14-4cb9-bbb6-eebd4511d251', 'status':'VISIBLE', 'txnId':'4005'}
提交成功,但未可見
SelectDB的事務提交分為兩步提交和發布版本。
完成了發布版本步驟后,結果才對您可見。若已經提交成功,那么最終一定會發布成功。SelectDB會嘗試在提交完后等待發布版本一段時間,如果超時后發布版本還未完成,會優先返回,提示您提交已經完成。
DELETE FROM test_tbl PARTITION p1 WHERE k1 = 1;
Query OK, 0 rows affected (0.04 sec)
{'label':'delete_e7830c72-eb14-4cb9-bbb6-eebd4511d251', 'status':'COMMITTED', 'txnId':'4005', 'err':'delete job is committed but may be taking effect later' }
返回結果的JSON字符串參數說明如下。
參數名稱 | 參數說明 |
rows affected | 表示此次刪除影響的行。由于SelectDB的刪除目前是邏輯刪除,因此當前的這個值恒為0。 |
label | 自動生成的Label,是該導入作業的標識。每個導入作業都有一個在單Database內部唯一的Label。 |
status | 表示數據刪除是否可見,如果可見則顯示VISIBLE,如果不可見則顯示COMMITTED。 |
txnId | 這個Delete job對應的事務ID。 |
err | 顯示一些本次刪除的詳細報錯信息。 |
提交失敗,事務取消
DELETE語句沒有提交成功,將會被SelectDB自動中止,返回如下結果。
DELETE FROM test_tbl PARTITION p1 WHERE k1 > 80;
ERROR 1064 (HY000): errCode = 2, detailMessage = {錯誤原因}
若刪除操作超時,將會返回timeout時間和未完成的(tablet=replica)
DELETE FROM test_tbl PARTITION p1 WHERE k1 > 80;
ERROR 1064 (HY000): errCode = 2, detailMessage = failed to delete replicas from job: 4005, Unfinished replicas:10000=60000, 10001=60000, 10002=60000
通過上述示例,DELETE操作返回結果的正確處理邏輯為:
返回結果為
ERROR 1064 (HY000)
,則表示刪除失敗。返回結果為
Query OK
,則表示刪除執行成功。如果status為
COMMITTED
,表示數據仍不可見,您可以稍等一段時間再用show delete
命令查看結果。如果status為
VISIBLE
,表示數據刪除成功。
查看歷史記錄
您可以通過SHOW DELETE語句查看歷史上已執行完成的刪除記錄。
語法如下。
SHOW DELETE [FROM db_name]
示例如下。
SHOW DELETE FROM test_db;
+-----------+---------------+---------------------+-----------------+----------+
| TableName | PartitionName | CreateTime | DeleteCondition | State |
+-----------+---------------+---------------------+-----------------+----------+
| empty_tbl | p3 | 2020-04-15 23:09:35 | k1 EQ "1" | FINISHED |
| test_tbl | p4 | 2020-04-15 23:09:53 | k1 GT "80" | FINISHED |
+-----------+---------------+---------------------+-----------------+----------+
2 rows in set (0.00 sec)
相關FE配置
TIMEOUT配置
SelectDB刪除作業的超時時間限制在30秒到5分鐘時間內,具體時間可通過如下配置項調整。
tablet_delete_timeout_second
DELETE自身的超時時間是由分區下Tablet的數量彈性改變的。此項配置為平均一個Tablet所貢獻的Timeout時間,默認值為2,單位是秒。假設此次刪除所指定分區下有5個Tablet,那么可提供給DELETE的Timeout時間為10秒,由于低于最低超時時間30秒,因此最終超時時間為30秒。
load_straggler_wait_second
如果您預估的刪除數據量確實比較大,使得5分鐘的上限不足時,您可以通過此項調整Timeout上限,默認值為300,單位是秒。Timeout的具體計算規則為:
TIMEOUT = MIN(load_straggler_wait_second, MAX(30, tablet_delete_timeout_second * tablet_num))
query_timeout
DELETE本身是一個SQL命令,因此刪除語句也會受Session限制。Timeout還受Session中的
query_timeout
值影響,因此可以通過SET query_timeout = xxx
來增加超時時間,默認值為900,單位是秒。
IN謂詞配置
max_allowed_in_element_num_of_delete
如果在使用IN謂詞時需要占用的元素比較多,您可以通過此項調整允許攜帶的元素上限,默認值為1024。