在 PostgreSQL 数据库表上执行“DELETE”操作时,我遇到了严重的性能问题。删除 15488 条记录的执行时间为 79423.768 毫秒,与“INSERT”或“SELECT”等其他操作相比非常慢。对于为什么会发生这种情况以及优化删除操作的可能方法,我将不胜感激。
背景:我使用 PostgreSQL 引擎版本 12.14 作为应用程序的后端,并且我注意到从一个表中删除记录需要花费出乎意料的长时间。涉及的表定义了索引和约束,数据库大小相对较小,预计会增长到几 GB。然而,对于这个特定的表,这个问题似乎更加明显,而其他表则表现良好。
硬件是 AWS db.t2.micro 实例,具有 1 个 CPU 核心、1 (GiB) 内存和 20 (GiB) 通用 SSD 用于存储。
column_name_loading
表架构,我们尝试从中删除的表。
列名称 | 数据类型 | 描述 |
---|---|---|
ID | 文本 | 首要的关键 |
散列 | 文本 | 首要的关键 |
日期_从 | 时间戳 | 首要的关键 |
日期到 | 时间戳 | |
测量位置uuid | 通用唯一标识符 | 主键、外键 |
列名 | 文本 | 不为空 |
统计类型id | 文本 | |
被忽略 | 布尔值 | |
笔记 | 文本 | |
更新时间 | 时间戳 | |
更新者 | 通用唯一标识符 |
可以看到,上表有一个复合主键,涉及4列。有两个表具有对该column_name_loading
表的外键引用
第一桌
ALTER TABLE
logger_main_config_column_name_loading
ADD
CONSTRAINT column_name_loading_fkey FOREIGN KEY (
column_name_loading_measurement_location_uuid,
column_name_loading_id,
column_name_loading_hash,
column_name_loading_date_from
) REFERENCES …
Run Code Online (Sandbox Code Playgroud)