在大型PostgreSQL表

时间:2017-03-27 11:38:13

标签: database postgresql database-performance amazon-rds postgresql-9.3

我正在尝试提高简单UPDATE查询的速度,但是对于一行来说它需要0.7-1.5秒,这太慢了。

UPDATE users SET firstname = 'test' WHERE userid=2120;

以下是解释:

Update on users  (cost=0.43..8.45 rows=1 width=331) (actual time=0.068..0.068 rows=0 loops=1)
->  Index Scan using users_pkey on users  (cost=0.43..8.45 rows=1 width=331) (actual time=0.039..0.040 rows=1 loops=1)
    Index Cond: (userid = 2120)
Trigger updatemv: time=727.372 calls=1
Total runtime: 727.487 ms

数据库总大小为20GB,大约有60个表。我的表'用户'有问题,有136万行。表'users'有36列(4个bigint,5个整数,10个字符变化(从32到255),其他是布尔字段),其中一半对于很多行都是空的。 “用户”表上还有6个索引。数据库托管在Amazon RDS db.m4.2xlarge上,具有8个vCPU,32 GB RAM和100 GB SSD。 PostgresSQL的版本是9.3。

我尝试过VACUUM ANALYZE表,这有帮助,但它仍然太慢。

我读到了关于升级RAM / CPU,调整postgresql.conf中的数据库,为大表创建分离的表空间等等。但我不确定处理具有百万行的大表的最佳方法是什么。

根据目前的趋势,未来12个月我的桌子将增加到20万行,所以我需要持久的解决方案。

如何提高大表上UPDATE查询速度的建议是有帮助的。

2 个答案:

答案 0 :(得分:0)

调整postgresql.conf中的参数可以产生巨大的影响并且它是免费的,所以我会从那里开始。默认值太低。

答案 1 :(得分:0)

谢谢@joop我解决了我的问题。我有触发刷新物化视图。当我删除它时,更新查询只需0.123毫秒而不是727.487毫秒,快6000倍。

我以不同的方式组织了物化视图。