SQL查询中的微小更改导致整个网络接收和之后的提交计数增加


  • 亚马逊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)

相关内容

最新更新