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的時候做合并。更多原理請參見Hologres高性能寫入技術揭秘。為了提高刪除(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完成后存儲會下降,詳情請參見技術原理。