时序数据的特点之一是"写多删少",但数据清理仍然是必不可少的操作。SonnetDB 的 DELETE 语句采用 Tombstone(墓碑)机制而非直接物理删除,这一设计在保证写入性能的同时,也提供了数据恢复的可能性。
SonnetDB 的 DELETE 语法与标准 SQL 类似,支持按时间范围或 Tag 条件删除数据:
-- 按时间范围删除
DELETE FROM cpu
WHERE host = 'server-01'
AND time >= 1713658080000
AND time <= 1713658140000;
-- 按 Tag 删除整条序列
DELETE FROM signal
WHERE source = 's-1';
删除操作是持久的,但建议在执行删除前先用对应的 SELECT 语句确认影响范围:
-- 先预览将要删除的数据
SELECT count(*) FROM cpu
WHERE host = 'server-01'
AND time >= 1713658080000
AND time <= 1713658140000;
-- 确认无误后再执行删除
DELETE FROM cpu
WHERE host = 'server-01'
AND time >= 1713658080000
AND time <= 1713658140000;
与传统的"找到数据块、擦除、重写"的硬删除方式不同,SonnetDB 采用 Tombstone 机制:
| 特性 | Tombstone 机制 | 硬删除 |
|---|---|---|
| 执行速度 | 极快(仅写元数据) | 慢(需读写数据文件) |
| 数据恢复 | 在 Compaction 前可恢复 | 不可恢复 |
| 空间释放 | 延迟释放(Compaction 时) | 立即释放 |
| 写入放大 | 无 | 高 |
| 并发影响 | 低 | 高 |
Tombstone 机制的核心理念是"先标记,后清理"。这在时序数据库中尤为重要,因为时序数据的写入通常是持续的高吞吐量流式写入,如果每次删除都需要重写数据文件,将严重影响写入性能。
SonnetDB 的 Compaction 管理器会自动处理 Tombstone 的消化。在 Compaction 过程中:
这个过程对用户是完全透明的,你不需要手动干预。SonnetDB 的 Compaction 使用 Size-Tiered 策略,会在后台按计划自动执行,确保在删除数据后存储空间最终被回收。
如果你需要立即释放空间(例如在测试环境中),可以触发手动 Compaction,不过在大多数生产环境中,让系统自动消化 Tombstone 就足够了。