全部產品
Search
文件中心

Hologres:DELETE

更新時間:Mar 13, 2026

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為了提高刪除(DELETE)的效率,盡量通過Fixed Plan執行DELETE語句,詳情請參見Fixed Plan加速SQL執行,或者建議為表設定合適的主鍵和索引(Distribution Key,Segment Key,Clustering Key),這樣就能快速定位到需要被刪除的檔案和檔案號,否則是全表掃描,對效能有一定的犧牲。對於按照主鍵點查的SQL(delete from tablename where pk =xxx),行存表的刪除效率要高於列存表。

使用限制

  • Hologres暫不支援直接刪除分區表父表。您需要刪除具體的分區表子表後,才可以刪除分區表父表。

  • 如果執行整表資料的清空刪除,建議使用TRUNCATE文法,效率遠比DELETE更高,參考 TRUNCATE

  • 推薦使用Fixed Plan最佳化DELETE執行效率,參考 DELETE情境

  • Hologres中的DELETE命令與PostgreSQL的一樣,使用標記刪除,在下一次Compaction後,儲存空間才會被釋放。由於採用LSM結構儲存記憶體狀態,在DELETE執行之後,有機率存留部分未達到Compaction閾值的臨時資料會繼續佔用儲存空間,如需徹底刪除,建議使用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='';
            

更多關於DELETE的詳情,請參見PostgreSQL DELETE

常見問題

在執行DELETE命令時,為什麼監控指標中儲存用量上漲非常多,寫入完成後儲存用量又下降?delete儲存用量

根據DELETE的原理,DELETE時會將老資料做標記,新資料會Flush成新的小檔案,後台會將這些小檔案做Compaction,在Compaction的過程中就會將老資料給清理掉,併合並新資料。為了刪除的速度儘可能的快,後台會先將資料寫完,待非同步Compaction時再執行壓縮和整理,因此會看到在資料刪除過程中,資料的儲存會一定的膨脹,等Compaction完成後儲存會下降,詳情請參見技術原理