我又一个表A,三个子表B、C和D, 表A与bcd都是一一对应,
现在需求是:
表A一次插入10万条记录,同时,bcd表也要插入10万条记录;
后台java+hibernate:save(list),然后save(list),然后save(list),最后save(list),这样插入1万条,差不多就需要10分钟(开发环境)。
我用mysql写存储过程,while循环中,insert a,insert b,insert c,insert d,这样循环10万次,发现时间更久(1万条二十分钟左右)。
问题:
1.为什么存储过程反而慢,是因为不停的变换操作的表么
2.有没有什么方法可以解决这个效率问题,插入10万条记录实在太慢
求高手解答啊
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
没遇到过这样,一次插入这么多。不过如果是我的话,我可能会生成sql文件/语句去执行。
可能的问题:
1.bcd表都需要a表的主键作为外键,而a表的主键有可能是自增的,这时在插入a表时要记录a表当时最大的id,以便推测下一个id的值,这样对于bcd表只需要在最大的id上增加就行,外键就不会有问题。
2.对于a表与bcd表为uuid(或者类似时),先将a插入,记录每次的主键,再将bcd的表要插入的记录拼接成sql语句一次执行。
猜测你的问题:save(List)/存储过程,是一条一条的执行,而不是一次执行。
mysql中(oracle应该也有类似的),第二种的速度极快:
1:insert into a (a,b,c);insert a (a1,b1,c1); //单条插入,插入2条数据,执行两次
2:insert into a (a,b,c),(a1,b1,c1); //一次插入2条,执行一次。