在大型 PostgreSQL table 上更新查询太慢
Update query too slow on big PostgreSQL table
我正在尝试提高简单 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 tables。我对 table 'users' 有 136 万行的问题。 Table 'users' 有 36 列(4 个 bigint,5 个整数,10 个字符变化(从 32 到 255),其他是布尔字段),其中一半对于很多行来说是空的。 'users' table 上也有 6 个索引。数据库托管在 Amazon RDS db.m4.2xlarge 上,配备 8 个 vCPU、32 GB RAM 和 100 GB SSD。 PostgresSQL 版本为 9.3。
我尝试了 VACUUM ANALYZE tables,这很有用,但还是太慢了。
我阅读了有关升级 RAM/CPU、在 postgresql.conf 中调整数据库、为大 table 创建单独的 table 空间等内容。但我不确定是什么处理具有百万行的大型 table 的最佳方法。
根据目前的趋势,我的 table 将在未来 12 个月内增长到 2000 万行,因此我需要持久的解决方案。
关于如何提高大 table 上的 UPDATE 查询速度的任何建议都会有所帮助。
调整 postgresql.conf 中的参数会产生巨大的影响,而且它是免费的,所以我会从这里开始。默认值太低了。
谢谢@joop 我解决了我的问题。我有触发器刷新物化视图。当我删除它时,更新查询只需要 0.123 毫秒而不是 727.487 毫秒,快了 6000 倍。
我以不同的方式组织了物化视图。
我正在尝试提高简单 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 tables。我对 table 'users' 有 136 万行的问题。 Table 'users' 有 36 列(4 个 bigint,5 个整数,10 个字符变化(从 32 到 255),其他是布尔字段),其中一半对于很多行来说是空的。 'users' table 上也有 6 个索引。数据库托管在 Amazon RDS db.m4.2xlarge 上,配备 8 个 vCPU、32 GB RAM 和 100 GB SSD。 PostgresSQL 版本为 9.3。
我尝试了 VACUUM ANALYZE tables,这很有用,但还是太慢了。
我阅读了有关升级 RAM/CPU、在 postgresql.conf 中调整数据库、为大 table 创建单独的 table 空间等内容。但我不确定是什么处理具有百万行的大型 table 的最佳方法。
根据目前的趋势,我的 table 将在未来 12 个月内增长到 2000 万行,因此我需要持久的解决方案。
关于如何提高大 table 上的 UPDATE 查询速度的任何建议都会有所帮助。
调整 postgresql.conf 中的参数会产生巨大的影响,而且它是免费的,所以我会从这里开始。默认值太低了。
谢谢@joop 我解决了我的问题。我有触发器刷新物化视图。当我删除它时,更新查询只需要 0.123 毫秒而不是 727.487 毫秒,快了 6000 倍。
我以不同的方式组织了物化视图。