数组字段与字符变化性能在Postgres



我有一个表,其中一列的类型字符变化。在这里存储一个字符串化数组,然后在应用程序代码中进行转换。

现在我们在这个列上做更新操作时遇到了性能问题。更新字段需要2-3分钟。数组大小一般为3000-10000项。

我认为将字段更改为数组字段可以帮助提高性能时间,但我想确认这一点。如果你有任何其他的想法来减少该表的更新时间。理想情况下,我们希望它的顺序是s或ms。

感谢我正在添加这个查询的解释分析的输出:

UPDATE events_table array_list_events=%(keyframe_list)s WHERE id = %(events_table_id)s
"Update on events_table  (cost=0.42..2.64 rows=1 width=656) (actual time=1.951..1.951 rows=0 loops=1)"
"  ->  Index Scan using events_table on sequence  (cost=0.42..2.64 rows=1 width=656) (actual time=1.433..1.434 rows=1 loops=1)"
"        Index Cond: (id = 911813)"
"Planning Time: 0.706 ms"
"Execution Time: 2.006 ms"

我无法理解的是,手动多次返回相当快。但是我们也有这个查询花费了100秒的记录,是什么导致了这个呢?

即使写这样长的textvarchar在PostgreSQL中也不会花那么长时间。请提供语句的EXPLAIN (ANALYZE, BUFFERS)输出来验证。

一个可能的解释是这样一个短的操作花了这么长的时间,可能是一个并发的长时间运行的事务持有一个冲突的锁,阻塞了更新。设置log_lock_waits = on,看看你是否在PostgreSQL日志中得到任何消息。

无论您是将数组存储在字符串中还是存储在正确的数组数据类型中,它总是一个大的东西,UPDATE应该花费大约相同的时间。

如果您从不在数据库中使用数组元素,并且您所做的只是存储和检索这些元素,那么从性能的角度来看,使用textvarchar列可能更可取。如果你在数据库中访问数组元素,或者你想让PostgreSQL检查数组的语法是否正确,使用数组类型。

最新更新