免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cdcchen
打印 上一主题 下一主题

试了一下php连接pgsql,不知道为什么速度好慢 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-23 17:14 |只看该作者
原帖由 perlpg 于 2007-3-23 00:14 发表
其实我不懂java,但对数据库还是懂得一点点的。


天啊!平时就这样写程序的吗?要是测试干脆写成:
con.ExecuteStatement(str);
不就完了嘛,对于批量插入,应该是使用下面的方法才合理吧?



我没有j ...


嗯,有道理,我试试。

我也是 java 初学者,当时没想过程序优化,只是正确实现功能。

con.ExecuteStatement(str); 这个对于批量插入,效率低,看过的子料都不推荐。

[ 本帖最后由 likuku 于 2007-3-23 17:19 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-03-24 00:44 |只看该作者

  1. for (int i=1;i<=st;i++){
  2.      ......
  3.      str = "insert into test (id,txt) values(?,?);";
  4.      PreparedStatement pstmt = con.prepareStatement(str);
  5.      ......
  6. }   
复制代码

按道理这样用语句句柄和
con.ExecuteStatement(str);
所做的工作对数据库来说没有区别, 都是准备一个句柄, 插入数据后丢弃该句柄, 然后下一个循环再准备一个..., 但你至少可以少写点代码吧? 我不知道java是如何处理这样的语句的(有智能缓存?), 但按我所知道编程语言的规则, 其工作和我描述的应该是一致的, 但第二种方法就不一样, 语句句炳只准备一次, 然后重复用了st次。
打个比喻,1000千个人去食堂吃饭,你的方法是每个人一个菜单,厨房为每个人独立做一次,要做完1000份饭要多长时间你算吧,而第二种用法的意思是让厨房做足够的菜,开饭的时候每人打一份,这样的效率当然就高了。
你虽然也使用了
     str = "insert into test (id,txt) values(?,?);";
     PreparedStatement pstmt = con.prepareStatement(str);
来做准备,但很不幸的是:用错地方了!在循环里面用,就是每个循环要准备一次,3000个循环下来就是3000次,在一个数据库操作中,准备是很费时间的,至少要比真正往数据库中插入一条记录使用的时间要多。

这也不算优化的事情,一个常识来的。

如果打开PG的储存冲刷,又使用默认的事务(就是每执行一条语句一个事务),则Insert和Update是很慢的,因为从数据安全性考虑,一个事务完成并真实保存到磁盘后数据才算是比较安全的。速度优化的方法有很多,例如使用合适大小的事务,忽略储存冲刷等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP