社区
Java SE
帖子详情
JDBC更新一个大表的速度怎么那么慢?
badhorse
2006-12-21 09:11:01
我用的是Sql server数据库,表大约有150万条纪录
在Java程序中使用Sql语句更新表中的一条纪录,要花超过30秒的时间。但使用查询分析器执行该语句,在1秒内即可执行完毕。
请大家指教!
...全文
430
30
打赏
收藏
JDBC更新一个大表的速度怎么那么慢?
我用的是Sql server数据库,表大约有150万条纪录 在Java程序中使用Sql语句更新表中的一条纪录,要花超过30秒的时间。但使用查询分析器执行该语句,在1秒内即可执行完毕。 请大家指教!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
30 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lixiaoxue85
2006-12-21
打赏
举报
回复
速度永远不是瓶颈
mathsfan
2006-12-21
打赏
举报
回复
这个年代效率最重要,语句写的再好,执行不快还是白搭```
badhorse
2006-12-21
打赏
举报
回复
看来只能先使用普通Statement语句组装Sql了, 原语句有90多个参数, 会是一条非常丑陋的语句。唉...
badhorse
2006-12-21
打赏
举报
回复
我试了微软的jdbc驱动和JDTS, 结果一样。
badhorse
2006-12-21
打赏
举报
回复
我查了些资料, 好像是数据库处理prepareStatement使用的执行计划于普通Statement的执行计划不同。
dreamover
2006-12-21
打赏
举报
回复
可能是sqlserver的jdbc驱动里对prepareStatement的处理方式的问题
badhorse
2006-12-21
打赏
举报
回复
呵呵, 我随便用的一个号码, 不知道是不是有效号码。
marckle
2006-12-21
打赏
举报
回复
调试一下,看看到底具体那一段执行时间长,然后想办法优化这一段。标准的SQL都很快的,用了上层的一些函数就会数量级的慢。
fool_leave
2006-12-21
打赏
举报
回复
把私人信息隐藏一下吧
badhorse
2006-12-21
打赏
举报
回复
什么意思呀
lcllcl987
2006-12-21
打赏
举报
回复
"where user_mobile = '8613910866967' and USSDPortal = '138*11' " +
//'8613910866967' 但愿是假号码
badhorse
2006-12-21
打赏
举报
回复
不用ReqDBReq我试了一下, 还是同样慢。
shine333
2006-12-21
打赏
举报
回复
Req2DBReq会有问题吗?
你干吗不试试sql=".... where user_mobile = ? and USSDPortal = ? .... "
pstmt.setString(1, "86....."); //但愿那个测试的是假号码
badhorse
2006-12-21
打赏
举报
回复
我把代码写成下面这样, 速度就很快了, 难道使用参数复制的方式组装Sql语句会有性能问题?
private void updateStatTable(Req2DBReq req)
{
String sql = "update t_stat_hour_user set FNum = FNum + 1 " +
"where user_mobile = '8613910866967' and USSDPortal = '138*11' " +
"and time_begin = cast('2006-12-21 09:00:00' as datetime)";
Connection conn = null;
PreparedStatement pstmt = null;
try
{
Date now = new Date();
conn = DBConnectionPool.getInstance().getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
}
catch (SQLException e)
{
DsmpProxyApp.getLog().error(
"数据库操作错误(Req2DBHandler):" + e.getMessage());
}
finally
{
DBTools.close(conn, pstmt, null);
conn = null;
pstmt = null;
}
}
badhorse
2006-12-21
打赏
举报
回复
我在查询分析器中执行以下语句, 一瞬间即可完成:
update t_stat_hour_user set FNum = FNum + 1
where user_mobile = '8613910866967' and USSDPortal = '138*11' and time_begin = cast('2006-12-21 09:00:00' as datetime)
badhorse
2006-12-21
打赏
举报
回复
我把原来的函数精简了, 结果一样, 下面是完整的函数:
private void updateStatTable(Req2DBReq req)
{
String sql = "update t_stat_hour_user set FNum = FNum + 1 where user_mobile = ? and USSDPortal = ? and time_begin = ? ";
Connection conn = null;
PreparedStatement pstmt = null;
try
{
Date now = new Date();
conn = DBConnectionPool.getInstance().getConnection();
pstmt = conn.prepareStatement(sql);
GregorianCalendar timeBegin = null;
timeBegin = new GregorianCalendar();
timeBegin.setTime(now);
timeBegin.set(GregorianCalendar.MINUTE, 0);
timeBegin.set(GregorianCalendar.SECOND, 0);
timeBegin.set(GregorianCalendar.MILLISECOND, 0);
pstmt.setString(1, req.getMobile());
pstmt.setString(2, req.getUSSDPortal());
pstmt
.setTimestamp(3, new Timestamp(timeBegin.getTime().getTime()));
pstmt.executeUpdate();
}
catch (SQLException e)
{
DsmpProxyApp.getLog().error(
"数据库操作错误(Req2DBHandler):" + e.getMessage());
}
finally
{
DBTools.close(conn, pstmt, null);
conn = null;
pstmt = null;
}
}
fool_leave
2006-12-21
打赏
举报
回复
你这个sql在修改参数后和你在查询分析器里面的完全一样吗?
主要是where语句,一定一样吗?
newste
2006-12-21
打赏
举报
回复
不过我觉得可能是你的代码有问题,你单独写个方法测试下看看,是不是也需要30秒;
newste
2006-12-21
打赏
举报
回复
关注下
hbwhwang
2006-12-21
打赏
举报
回复
不会吧?
加载更多回复(10)
jdbc
sqlserver update语句 执行
速度
慢
问题描述 在java中执行update语句,
更新
一个
有150万条记录的表,
速度
特别
慢
,约2条sql语句/s。 分析 影响通过
jdbc
执行update语句的因素主要有如下几种: 网络IO(对应解决方案1) 执行update语句(对应解决方案2)
速度
过
慢
主要是update语句中的where子句造成的。 解决方案 1. 采用
jdbc
批量执行,减少java io。 主要用到如下几个方法: addBa...
线上bug! Sharing-
JDBC
第一次查询为什么这么
慢
?
Sharing-
JDBC
第一次查询为什么这么
慢
?一、缘起二、追踪过程1、问题复现2、问题追踪1)github Issues 寻找线索2)分析对比三、结论 一、缘起 内部框架发布了新版本,有开发反馈sharding查询
慢
。通过一系列对比分析之后解决了问题。本文对过程中的一些思考,思路做个总结。 二、追踪过程 1、问题复现 示例大致重现如下: @Test public void testInse...
Oracle 的
JDBC
写入有多
慢
?
在《Oracle 和 MySQL 的
JDBC
到底有多
慢
》中我们测试过 Oracle的
JDBC
读出性能,现在再来测试一下写入情况。 1. 数据来源 使用TPCH生成的数据,选用其中的part表来做测试,数据记录为2000万行,9个字段。它生成的原始文本文件名为part.tbl,文件大小为2.4G。 测试时先将文本读入内存形成内存对象,然后再写入,文本读入的时间不计在内。...
JDBC
执行sql
慢
的问题
今天发现
JDBC
的
一个
怪问题。 同样的sql,在mysql客户端中执行只要0.6、7秒,但是在
JDBC
中执行却要十二三分钟!这差距也太大了!而且只是其中一张表如此,查看表结构,很正常,没有索引,连主键都没有,就只有字段,字段类型也没有BLOB、CLOB之类的大数据类型,和其他表相比,字段数量也差不错。那就奇怪了,虽说
JDBC
是要
慢
些,但是不至于差别几百倍吧。再对比sql,唯一不同的就是这个
慢
java批处理越跑越
慢
_批量处理
JDBC
语句提高处理
速度
有时候
JDBC
运行得不够快,这使得有些程序员使用数据库相关的存储过程。作为
一个
替代方案,可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高
速度
。存储过程的最简单的形式就是包含一系列SQL语句的过程,将这些语句放在一起便于在同
一个
地方管理也可以提高
速度
。Statement 类可以包含一系列SQL语句,因此允许在同
一个
数据库事务执行所有的那些语句而不是执行对数据库的一系列...
Java SE
62,628
社区成员
307,258
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章