删除操作是困难的

主要观点:DELETE 操作看似简单,实则隐藏诸多复杂性,易导致数据库性能下降等问题。
关键信息:

  • DELETE 执行时会经历行识别、锁获取、触发器执行、标记删除、索引更新等一系列步骤,事务提交后变化才永久可见,未物理删除的数据会导致膨胀。
  • AUTOVACUUM 清理死元组需扫描表、检查可见性等多步骤,虽能保持数据库状态,但仍有工作量。
  • 复制环境中 DELETE 更需时间敏感,操作大小会影响 WAL 记录和系统性能,资源竞争也增加复杂性,最终需 autovacuum 物理删除数据。
  • 软删除虽易实现但非真正的数据删除机制,存在数据一致性等问题,只是推迟了处理。
  • 批处理是应对大规模 DELETE 的有效方法,可利用子查询或 CTE 按批次删除,避免一次性处理大量数据。
  • 对于自然分段的数据,可通过分区直接删除或截断相关分区,提高效率。
    重要细节:
  • PostgreSQL 文档中提供了简单的 DELETE 示例,如DELETE FROM films WHERE kind <> 'Musical'; DELETE FROM films;
  • UPDATE 操作在复杂性上接近 DELETE,但通常设计更易处理,如通常只修改有限列、不一定触发全表更新等。
  • AUTOVACUUM 处理过程包括扫描表、检查元组可见性、物理删除、更新索引等,还会更新表统计等。
  • 批处理可利用ctid或主键进行,避免一次性处理大量数据,同时需规划好 autovacuum 处理膨胀问题。
  • 分区可高效处理删除操作,避免扫描等开销,但会增加 schema 设计和查询规划的复杂性。
阅读 10
0 条评论