我有一个Postgres数据库,每天向其中插入大约2000万行。
这些记录是通过一个powershell脚本插入的,该脚本计算插入每个记录所需的平均时间。通常每条记录大约需要1.5ms (包括一些记录解析和触发器)。
每隔一次(通常在添加了大约300万行之后),处理时间会跳到大约12‘s/记录(这是一个非常明显的步骤更改,很快就会发生)
我已经找到解药了。我停止添加记录的过程,在表上进行分析,然后重新启动过程。插入时间返回到1.5ms/记录。虽然这只需要5-10分钟,但在这段停机时间内,我确实丢失了数千条记录。
数据库已经在夜间关闭了一段短暂的时间,所有的表都定期获得ANALYSEd,但是有什么方法可以避免在白天进行额外的分析呢?
(注:我尝试过简单地停止并重新启动插入进程-这没有什么区别。)只有停下来,做一个分析,然后重新开始,这才是不同的)
发布于 2018-09-19 02:46:40
试着在不停止过程的情况下使用分析。我想你已经试过了,不是吗?一种选择是只分析特定的列,这比分析整个表所花费的时间要少。通常自动真空是在postgres数据库上活动的,启用该功能将允许数据库在后台进行分析。
检查:https://www.postgresql.org/docs/9.6/static/routine-vacuuming.html#AUTOVACUUM
这是运行分析时的公式:
analyze threshold = analyze base threshold + analyze scale factor * number of tuples议员们在这里:
这些值可以在表级别上设置,不需要对所有表都有相同的规则。
ALTER TABLE a_lot_of_inserts SET ( autovacuum_analyze_threshold = 50 , autautovacuum_analyze_scale_factor = 0.01 ) 试着和他们玩,直到你找到正确的价值。
https://dba.stackexchange.com/questions/217970
复制相似问题