社区
Java SE
帖子详情
JDBC更新一个大表的速度怎么那么慢?
badhorse
2006-12-21 09:11:01
我用的是Sql server数据库,表大约有150万条纪录
在Java程序中使用Sql语句更新表中的一条纪录,要花超过30秒的时间。但使用查询分析器执行该语句,在1秒内即可执行完毕。
请大家指教!
...全文
465
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中
更新
大量数据库记录(约150万条)时遇到的性能瓶颈,并提出了两种有效解决方案:一是利用
JDBC
批量执行
更新
操作,二是优化表设计,将where子句涉及的列设置为主键,显著提升
更新
速度
。
大表
的update
更新
本文介绍了针对含有上亿条记录的
大表
进行批量
更新
的有效方法。从直接
更新
导致长时间执行及回滚的问题出发,逐步探索了使用存储过程分批提交、通过创建新表并行处理以及利用视图间接
更新
等方案,最终实现了高效的数据
更新
。
JDBC
是什么
JDBC
(Java Database Connectivity)是Java数据库连接API,用于访问各种关系数据库。它包括两层结构:面向底层的驱动程序管理器接口和面向程序员的
JDBC
API。核心接口如Connection、PreparedStatement、Statement和ResultSet提供了数据库交互的功能。
JDBC
的主要优点是简化数据库访问和增强可移植性,但
速度
可能较
慢
,并且更换数据源较为复杂。数据库驱动程序通常分为四类,其中第四类(本地协议驱动)提供最高效率。创建
JDBC
应用程序的步骤包括加载驱动、建立连接、执行查询等。
优化HBase维表初始化:通过
JDBC
游标技术实现高效、简化的数据迁移
在现代数据架构中,HBase常用于存储大规模维表数据,但传统的维表初始化方案存在效率低、资源消耗大等问题。本文引入基于
JDBC
流式传输(游标技术)的新方案,可逐行读取数据,避免OOM,提升了写入性能,简化了操作流程,增强了系统稳定性。
Java SE
62,622
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章