日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

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為了提高刪除(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完成后存儲會下降,詳情請參見技術原理