标签:postgres update 排查 报错 sql table where id 1000
程序批量插入数据时报错,将sql在navicat执行又不报错。报错信息:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800
查询资料参考资料发现postgreSQL JDBC驱动限定,client端的一个发送大小限制为2byte。
也就是批量插入的时候values里面的参数个数(行数*列数)不能超过32767。建议批量插入的时候设置为1000行左右提交一次。
引用:
这里举两个代表性栗子:
sql渣:
for i in (1-1000):
start transaction;
insert into table values (1);
commit;
end for
sql赞:
start transaction;
for i in (1-1000):
insert into table values (1);
end for
commit;
sql赞爆:
insert into table values (1)()...........()(1000);
首先,sql语法是我临时自创的,这个不是关键,关键在sql渣先生是1000个事务插1000行,日志flush1000次。sql赞先生是一个事务插1000行,事务日志flush1次。sql赞爆最nice。
这个例子我想表达的意思是如果你要用sql做一件事,那就要尽量让这件事占用的事务总时间最少。
第二个例子
sql渣:
update table where id > 0 and id < 1000000;
sql赞:
update table where id > 0 and id < 1000;
update table where id >= 1000 and id < 2000;
update table where id >= 2000 and id < 3000;
....
....
这个例子我想表达的意思是如果你要用sql做一件很大的事,那就尽量让大事化成很多小事。
两个例子好好体会下,一点不矛盾哦。补充一下,这里每个update都是单独事务
标签:postgres,update,排查,报错,sql,table,where,id,1000 来源: https://www.cnblogs.com/zhangfx01/p/16169078.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。