DELETE語句用於刪除目標表指定列的行資料。本文為您介紹在Hologres中DELETE語句的用法。
命令介紹
DELETE命令的文法如下所示。
DELETE FROM <table_name> [ * ] [ [ AS ] <alias> ]
[ WHERE <condition> ]參數說明如下表所示。
參數 | 描述 |
table_name | 目標表的名稱。 |
alias | 別名。目標表的替代名稱。 |
condition | 刪除目標表的條件。 |
技術原理
DELETE會先寫到記憶體表(Mem Table),然後Flush成檔案,如下圖所示。在此過程中,如果是行存表,被刪除的資料將會被Flush成一個新的小檔案,在Compaction的時候做合并成檔案塊;如果是列存表,系統會在記憶體中儲存一張標記表,然後Flush成標記表檔案,標記表檔案會記錄刪除的資料所在的檔案號(file id)和行號(row id),然後在Compaction的時候做合并。
為了提高刪除(DELETE)的效率,盡量通過Fixed Plan執行DELETE語句,詳情請參見Fixed Plan加速SQL執行,或者建議為表設定合適的主鍵和索引(Distribution Key,Segment Key,Clustering Key),這樣就能快速定位到需要被刪除的檔案和檔案號,否則是全表掃描,對效能有一定的犧牲。對於按照主鍵點查的SQL(delete from tablename where pk =xxx),行存表的刪除效率要高於列存表。
使用限制
樣本
刪除表的樣本語句如下。
CREATE TABLE delete_test (
id INT PRIMARY KEY,
a INT,
b text
);
INSERT INTO delete_test VALUES
(1, 10, 'a'),
(2, 30, 'b'),
(3, 50, ''),
(4, 70, null);
DELETE FROM delete_test AS dt WHERE dt.a = 10;
DELETE FROM delete_test AS dt WHERE dt.b is null;
DELETE FROM delete_test AS dt WHERE dt.b='';
更多關於DELETE的詳情,請參見PostgreSQL DELETE。
常見問題
在執行DELETE命令時,為什麼監控指標中儲存用量上漲非常多,寫入完成後儲存用量又下降?
根據DELETE的原理,DELETE時會將老資料做標記,新資料會Flush成新的小檔案,後台會將這些小檔案做Compaction,在Compaction的過程中就會將老資料給清理掉,併合並新資料。為了刪除的速度儘可能的快,後台會先將資料寫完,待非同步Compaction時再執行壓縮和整理,因此會看到在資料刪除過程中,資料的儲存會一定的膨脹,等Compaction完成後儲存會下降,詳情請參見技術原理。