CnosDB的資料更新和刪除

CnosDB發表於2024-01-14



CnosDB的資料更新和刪除

功能介紹

  • 支援更新 Tag 值。 
  • 支援更新 Field 值。
  • 支援刪除資料。
update clause :=
UPDATE <table name> SET <assignment clause> [, ...] [<WHERE clause>]
assignment clause :=
<column name> = <column value>
delete clause :=
DELETE FROM <table name> <WHERE clause>

基本原理

由於 Tag 值與 Field 值,在儲存引擎中的儲存形式及位置不同,所以更新邏輯也不同。

更新 Tag 值

Tag 值在儲存引擎中作為索引單獨儲存。所以對於 Tag 更新操作,需要更新索引。

步驟如下:

  1. 在 query 層根據 SQL 中的 tag 過濾條件,查詢出符合條件的所有 series。
  2. 向所有匹配的節點發出預更新請求,檢查是否會產生衝突,即原有的不同的 series 更新後成為相同的 series。如有衝突則本次 SQL 請求失敗。
  3. 檢查透過後,會提交實際的更新任務,此任務會在故障後重試,保證任務執行成功。
  4. 儲存引擎節點在接收到更新請求後,會首先記錄 UpdateSeriesKeys 型別的 WAL,然後更新索引。

執行計劃(簡化版)

UpdateTagValue
  Filter
    TagScan

更新 Field 值

根據 SQL 中的 WHERE 條件查詢表中資料,更新 Field 值後重新插入表中,利用 tskv 表的去重特性達到更新目的。

執行計劃(簡化版)

TableWriter
  Projection
    Filter
      TableScan

刪除資料

按 WHERE 條件過濾並刪除表中的資料,只支援針對 Tag 或 Time 列的表示式。

執行流程(簡化版)

DeleteFromTableTask
  Coordinate DML task on vnodes
    Vnode delete execution

 

示例演示

準備資料

ALTER DATABASE public SET ttl '1000000d';
DROP TABLE IF EXISTS dml_tbl;
CREATE TABLE IF NOT EXISTS dml_tbl(f0 BIGINT , f1 BIGINT , TAGS(t0, t1) );
INSERT dml_tbl(TIME, f0, f1, t0, t1)
VALUES
    ('1999-12-31 00:00:00.000', 111, 444, 'tag11', 'tag21'),
    ('1999-12-31 00:00:00.005', 222, 444, 'tag12', 'tag22'),
    ('1999-12-31 00:00:00.010', null, 222, 'tag12', 'tag23'),
    ('1999-12-31 00:00:10.015', 444, 111, 'tag14', 'tag24'),
    ('1999-12-31 00:00:10.020', 222, 555, 'tag14', 'tag21'),
    ('1999-12-31 00:10:00.025', 333, 555, 'tag11', 'tag22'),
    ('1999-12-31 00:10:00.030', 444, 333, 'tag11', 'tag23'),
    ('1999-12-31 01:00:00.035', 555, 222, 'tag14', 'tag24');

更新 Tag 值

UPDATE dml_tbl SET t0 = 'tag_new11', t1 = 'tag_new21' WHERE t0 = 'tag11' AND t1 = 'tag21';
  +-------------------------+-----------+-----------+-----+-----+
  | time                    | t0        | t1        | f0  | f1  |
  +-------------------------+-----------+-----------+-----+-----+
  | 1999-12-31T00:00:00     | tag_new11 | tag_new21 | 111 | 444 |
  | 1999-12-31T00:00:00.005 | tag12     | tag22     | 222 | 444 |
  | 1999-12-31T00:00:00.010 | tag12     | tag23     |     | 222 |
  | 1999-12-31T00:00:10.015 | tag14     | tag24     | 444 | 111 |
  | 1999-12-31T00:00:10.020 | tag14     | tag21     | 222 | 555 |
  | 1999-12-31T00:10:00.025 | tag11     | tag22     | 333 | 555 |
  | 1999-12-31T00:10:00.030 | tag11     | tag23     | 444 | 333 |
  | 1999-12-31T01:00:00.035 | tag14     | tag24     | 555 | 222 |
  +-------------------------+-----------+-----------+-----+-----+

更新 Field 值
UPDATE dml_tbl SET f1 = 999 WHERE t0 = 'tag14' AND time < '1999-12-31T00:00:10.020';
  +-------------------------+-----------+-----------+-----+-----+
  | time                    | t0        | t1        | f0  | f1  |
  +-------------------------+-----------+-----------+-----+-----+
  | 1999-12-31T00:00:00     | tag_new11 | tag_new21 | 111 | 444 |
  | 1999-12-31T00:00:00.005 | tag12     | tag22     | 222 | 444 |
  | 1999-12-31T00:00:00.010 | tag12     | tag23     |     | 222 |
  | 1999-12-31T00:00:10.015 | tag14     | tag24     | 444 | 999 |
  | 1999-12-31T00:00:10.020 | tag14     | tag21     | 222 | 555 |
  | 1999-12-31T00:10:00.025 | tag11     | tag22     | 333 | 555 |
  | 1999-12-31T00:10:00.030 | tag11     | tag23     | 444 | 333 |
  | 1999-12-31T01:00:00.035 | tag14     | tag24     | 555 | 222 |
  +-------------------------+-----------+-----------+-----+-----+
刪除資料
public ❯ DROP TABLE IF EXISTS dml_tbl_for_delete;
public ❯ CREATE TABLE IF NOT EXISTS dml_tbl_for_delete(f0 BIGINT , f1 BIGINT , TAGS(t0, t1) );
public ❯ INSERT dml_tbl_for_delete(TIME, f0, f1, t0, t1)
VALUES
    ('1999-12-31 00:00:00.000', 111, 444, 'tag11', 'tag21'),
    ('1999-12-31 00:00:00.005', 222, 444, 'tag12', 'tag22'),
    ('1999-12-31 00:00:00.010', null, 222, 'tag12', 'tag23'),
    ('1999-12-31 00:00:10.015', 444, 111, 'tag14', 'tag24'),
    ('1999-12-31 00:00:10.020', 222, 555, 'tag14', 'tag21'),
    ('1999-12-31 00:10:00.025', 333, 555, 'tag11', 'tag22'),
    ('1999-12-31 00:10:00.030', 444, 333, 'tag11', 'tag23'),
    ('1999-12-31 01:00:00.035', 555, 222, 'tag14', 'tag24');
+-------------------------+-------+-------+-----+-----+
| time                    | t0    | t1    | f0  | f1  |
+-------------------------+-------+-------+-----+-----+
| 1999-12-31T00:00:00     | tag11 | tag21 | 111 | 444 |
| 1999-12-31T00:00:00.005 | tag12 | tag22 | 222 | 444 |
| 1999-12-31T00:00:00.010 | tag12 | tag23 |     | 222 |
| 1999-12-31T00:00:10.015 | tag14 | tag24 | 444 | 111 |
| 1999-12-31T00:00:10.020 | tag14 | tag21 | 222 | 555 |
| 1999-12-31T00:10:00.025 | tag11 | tag22 | 333 | 555 |
| 1999-12-31T00:10:00.030 | tag11 | tag23 | 444 | 333 |
| 1999-12-31T01:00:00.035 | tag14 | tag24 | 555 | 222 |
+-------------------------+-------+-------+-----+-----+
public ❯ DELETE FROM dml_tbl_for_delete WHERE t0 = 'tag14' AND time < '1999-12-31T00:00:10.020';
+-------------------------+-------+-------+-----+-----+
| time                    | t0    | t1    | f0  | f1  |
+-------------------------+-------+-------+-----+-----+
| 1999-12-31T00:00:00     | tag11 | tag21 | 111 | 444 |
| 1999-12-31T00:00:00.005 | tag12 | tag22 | 222 | 444 |
| 1999-12-31T00:00:00.010 | tag12 | tag23 |     | 222 |
| 1999-12-31T00:00:10.020 | tag14 | tag21 | 222 | 555 |
| 1999-12-31T00:10:00.025 | tag11 | tag22 | 333 | 555 |
| 1999-12-31T00:10:00.030 | tag11 | tag23 | 444 | 333 |
| 1999-12-31T01:00:00.035 | tag14 | tag24 | 555 | 222 |
+-------------------------+-------+-------+-----+-----+

使用場景和案例

在時序資料庫中,通常會有一些特定的場景需要更新歷史資料,以下是一些可能需要使用 UPDATE DELETE 操作來更新歷史資料的情況:

  1. 資料校正 :有時候由於感測器誤差、通訊問題或其他原因,初始記錄的資料可能是錯誤的。在這種情況下,你可能需要透過 UPDATE DELETE 操作來校正歷史資料,以確儲存儲的資料準確無誤。
  2. 資料補全 :有時候由於裝置故障或通訊問題,某些時間段內的資料可能丟失。當問題得到解決後,你可能會收到補充的資料,並希望將其更新到歷史記錄中。
  3. 處理異常情況 :在某些特定的業務場景中,可能會出現需要更新、刪除歷史資料的情況,例如處理裝置升級後的資料變化。

注意事項和限制

  1. 在更新 Tag 值時,儘量減少 WHERE 選擇的資料量,大量的索引更新會帶來效能問題。
  2. 在更新 Tag 值時,由於 CnosDB 不提供事務保證,所以要避免進行資料寫入和刪除操作。
  3. 在刪除資料時,暫不支援複雜的條件表示式:對 time 列的過濾僅支援區間判斷,不支援複雜過濾(支援  WHERE time < ‘2023-01-01T00:01:00' ,但不支援  WHERE time % 2 = 0 )。除此之外,查詢條件只能使用 time 列和 Tag 列而不能使用 Field 列。

結語

本文主要介紹了在 CnosDB 中的資料更新刪除功能。包括如何更新 Tag 值和 Field 值、如何刪除資料,同時介紹了基本原理並提供了相應的示例演示和使用場景案例。

如果您有任何問題或意見,歡迎提出,我們可以進一步討論和改進相應功能。感謝閱讀本文!


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026635/viewspace-3003787/,如需轉載,請註明出處,否則將追究法律責任。

相關文章