- 亚马逊RDS上的Postgres 11.12
- 表中有40亿行
- 每秒1000个新行,以100个为一批插入
不久前,我添加了一个新列
ALTER TABLE my_table
ADD COLUMN my_new_column BOOLEAN NULL;
该列完全没有被使用,也没有明确插入任何内容。但是,当我将INSERT
查询更改为显式地将该列的值设置为null
时,则:
- 客户端批量插入新行执行速度慢5倍
- 网络接收吞吐量增长约5倍
- 提交数量增长约3倍
知道是什么原因造成的吗?下的示例
之前:
INSERT INTO my_table (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')
ON CONFLICT (column1, column2)
DO UPDATE
SET column3 = excluded.column3
之后:
INSERT INTO my_table (column1, column2, column3, my_new_column)
VALUES ('value1', 'value2', 'value3', null)
ON CONFLICT (column1, column2)
DO UPDATE
SET column3 = excluded.column3
感谢@jjanes的提示,我设法解决了这个问题。瓶颈就在驱动程序(Spring-JDBC(的某个地方。看起来无法解析该"null"值的类型,导致了整个开销。一旦我明确定义了类型,问题就得到了解决。以下示例:
之前:
val queryParams = mapOf("myNewColumn" to null)
jdbcTemplate.batchUpdate(query, queryParams)
之后:
val queryParams = MapSqlParameterSource().apply {
addValue("myNewColumn", null, Types.BOOLEAN)
}
jdbcTemplate.batchUpdate(query, queryParams)