DELETE
DELETE語句用于刪除目標(biāo)表指定列的行數(shù)據(jù)。本文為您介紹在Hologres中DELETE語句的用法。
命令介紹
DELETE命令的語法如下所示。
DELETE FROM <table_name> [ * ] [ [ AS ] <alias> ]
[ WHERE <condition> ]
參數(shù)說明如下表所示。
參數(shù) | 描述 |
table_name | 目標(biāo)表的名稱。 |
alias | 別名。目標(biāo)表的替代名稱。 |
condition | 刪除目標(biāo)表的條件。 |
技術(shù)原理
DELETE會(huì)先寫到內(nèi)存表(Mem Table),然后Flush成文件,如下圖所示。在此過程中,如果是行存表,被刪除的數(shù)據(jù)將會(huì)被Flush成一個(gè)新的小文件,在Compaction的時(shí)候做合并成文件塊;如果是列存表,系統(tǒng)會(huì)在內(nèi)存中存儲(chǔ)一張標(biāo)記表,然后Flush成標(biāo)記表文件,標(biāo)記表文件會(huì)記錄刪除的數(shù)據(jù)所在的文件號(file id)和行號(row id),然后在Compaction的時(shí)候做合并。更多原理請參見Hologres高性能寫入技術(shù)揭秘。為了提高刪除(DELETE)的效率,盡量通過Fixed Plan執(zhí)行DELETE語句,詳情請參見Fixed Plan加速SQL執(zhí)行,或者建議為表設(shè)置合適的主鍵和索引(Distribution Key,Segment Key,Clustering Key),這樣就能快速定位到需要被刪除的文件和文件號,否則是全表掃描,對性能有一定的犧牲。對于按照主鍵點(diǎn)查的SQL(delete from tablename where pk =xxx
),行存表的刪除效率要高于列存表。
使用限制
Hologres暫不支持直接刪除分區(qū)表父表。您需要?jiǎng)h除具體的分區(qū)表子表后,才可以刪除分區(qū)表父表。
如果執(zhí)行整表數(shù)據(jù)的清空刪除,建議使用TRUNCATE語法,效率遠(yuǎn)比DELETE更高,參考 TRUNCATE。
推薦使用Fixed Plan優(yōu)化DELETE執(zhí)行效率,參考 DELETE場景。
Hologres中的DELETE命令與PostgreSQL的一樣,使用標(biāo)記刪除,在下一次Compaction后,存儲(chǔ)空間才會(huì)被釋放。由于采用LSM結(jié)構(gòu)保存內(nèi)存狀態(tài),在DELETE執(zhí)行之后,有概率存留部分未達(dá)到Compaction閾值的臨時(shí)數(shù)據(jù)會(huì)繼續(xù)占用存儲(chǔ)空間,如需徹底刪除,建議使用TRUNCATE。
示例
刪除表的示例語句如下。
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='';
更多關(guān)于DELETE的詳情,請參見PostgreSQL DELETE。
常見問題
在執(zhí)行DELETE命令時(shí),為什么監(jiān)控指標(biāo)中存儲(chǔ)用量上漲非常多,寫入完成后存儲(chǔ)用量又下降?
根據(jù)DELETE的原理,DELETE時(shí)會(huì)將老數(shù)據(jù)做標(biāo)記,新數(shù)據(jù)會(huì)Flush成新的小文件,后臺會(huì)將這些小文件做Compaction,在Compaction的過程中就會(huì)將老數(shù)據(jù)給清理掉,并合并新數(shù)據(jù)。為了刪除的速度盡可能的快,后臺會(huì)先將數(shù)據(jù)寫完,待異步Compaction時(shí)再執(zhí)行壓縮和整理,因此會(huì)看到在數(shù)據(jù)刪除過程中,數(shù)據(jù)的存儲(chǔ)會(huì)一定的膨脹,等Compaction完成后存儲(chǔ)會(huì)下降,詳情請參見技術(shù)原理。