我有一张按日期组织的表格。在 8400 万行中,有 2600 万行都在一个日期命中。我想删除那个日期。
日期字段上有一个索引。
我delete from <table> where <date_field> = 'that date'
昨天开始了。它已经运行了将近 24 小时。
- AWS 向我展示了大约 3k 的稳定读取iops
- 每 5 分钟将峰值写入 10,否则为 0
- CPU 徘徊在 10% 左右
有没有办法估计这个删除是否会在太阳膨胀和地球被焚烧之前完成?我没想到会花这么长时间。这似乎非常缓慢。
编辑:
在我运行查询之前,我做了一个explain delete from <table> where <date_field> = 'that date'
,它似乎表明正在使用索引。
较新版本的 PostgreSQL 有一些监控进度的工具,但这些工具不包括 DELETE 操作。所以这种情况会让你独自一人。由于这是普通的 PostgreSQL,您可以登录到 shell,使用“top”来获取执行 DELETE 的进程的进程 ID,然后使用类似的东西 strace 该进程
然后你可以确定它当前在读取每个文件的哪个位置,这可以让你知道它取得了多少进展,以及它在 IO 上花费了多长时间。(它也会大大减慢这个过程,所以只需要足够长的时间来获取一些数据进行分析,比如 30 秒,然后取消 strace)
如果删除使用的是索引,那将使 strace 的分析复杂化。但是无论如何使用索引来删除表的 1/3 似乎都不是一个好主意。因此,
set enable_indexscan=off
首先这样做会使监控更容易,也可能会更快。如果将“删除”替换为“选择计数”,需要多长时间?
您能否显示“删除”或“选择计数(*)”的实际计划