update语句直接执行与写在存储过程中执行性能差别很大,为什么呢?

疯狂熊猫人 2015-04-13 05:45:01
今天在进行程序优化的时候,将每次update修改为了批量update,使用的是Java JDBC批量更新。
10万条数据,每次批量更新50条:
update:
1、直接使用update语句进行batch update,平均每次耗时100ms
2、将update语句写到存储过程中,调用存储过程batch update,平均每次11ms

insert:
1、直接使用update语句进行batch insert,平均每次耗时9ms
2、将insert写入存储过程batch insert,平均每次耗时11ms

为什么update会出现如此巨大的差别呢?
...全文
577 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JDK9 2015-10-22
  • 打赏
  • 举报
回复
牛人还是多,学习了
还在加载中灬 2015-04-14
  • 打赏
  • 举报
回复
我想如果能看下你的执行语句及相应的执行计划,应该能比较清楚的明白是为什么了 在这之前,我想很可能的和#2楼的说的情况一样,而INSERT语句一般只有一种可能的执行,同UPDATE的情况不一样,SQLSERVER不会再寻求更好的计划
疯狂熊猫人 2015-04-14
  • 打赏
  • 举报
回复
今天在进行程序优化的时候,将每次update修改为了批量update,使用的是Java JDBC批量更新。 10万条数据,每次批量更新50条: update: 1、直接使用sql语句进行batch update,平均每次耗时100ms 2、将update语句写到存储过程中,调用存储过程batch update,平均每次11ms insert: 1、直接使用sql语句进行batch insert,平均每次耗时9ms 2、将insert写入存储过程batch insert,平均每次耗时11ms 为什么update会出现如此巨大的差别呢? 各位大神能不能仔细看了问题再回复啊?我相信我描述的已经很明白了。各位不要避重就轻啊!
疯狂熊猫人 2015-04-14
  • 打赏
  • 举报
回复
引用 6 楼 ky_min 的回复:
9ms和11ms是同一个数量级的,这点差距说明不了问题
我的疑问是sql语句批量update会比调用存储过程批量update慢很多,但是insert却没有出现这个问题。列出的9ms与11ms只是说明insert的执行效率与使用存储过程关系不大。
还在加载中灬 2015-04-14
  • 打赏
  • 举报
回复
9ms和11ms是同一个数量级的,这点差距说明不了问题
Tiger_Zhao 2015-04-14
  • 打赏
  • 举报
回复
因为存在缓存和“执行计划重用”的优化,实际上循环调用相同的语句,很难明确什么时候会重编译执行计划。
不过单纯比较直接使用update语句和存储过程,可以说最明显的差别是是否需要编译。
如果为了比较大批量的循环执行,只能实测看SQL Server的优化效果如何了。
疯狂熊猫人 2015-04-14
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
直接使用update语句,每次调用都要先编译语句再执行。 而存储过程是已编译好的计划,无论调用多少次都是直接执行无需再编译。
insert: 1、直接使用update(写错了,应该是insert)语句进行batch insert,平均每次耗时9ms 2、将insert写入存储过程batch insert,平均每次耗时11ms
疯狂熊猫人 2015-04-14
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
直接使用update语句,每次调用都要先编译语句再执行。 而存储过程是已编译好的计划,无论调用多少次都是直接执行无需再编译。
如何解释直接使用insert语言会比把insert语句写在存储过程中调用要快呢?
Tiger_Zhao 2015-04-14
  • 打赏
  • 举报
回复
直接使用update语句,每次调用都要先编译语句再执行。
而存储过程是已编译好的计划,无论调用多少次都是直接执行无需再编译。
卖水果的net 版主 2015-04-14
  • 打赏
  • 举报
回复
你 java 程序,在执行 update 时,是不是与数据有交互 ? 如果有的话,肯定要慢下来。
Mr_Nice 2015-04-14
  • 打赏
  • 举报
回复
引用 8 楼 crazypandariy 的回复:
今天在进行程序优化的时候,将每次update修改为了批量update,使用的是Java JDBC批量更新。 10万条数据,每次批量更新50条: update: 1、直接使用sql语句进行batch update,平均每次耗时100ms 2、将update语句写到存储过程中,调用存储过程batch update,平均每次11ms insert: 1、直接使用sql语句进行batch insert,平均每次耗时9ms 2、将insert写入存储过程batch insert,平均每次耗时11ms 为什么update会出现如此巨大的差别呢? 各位大神能不能仔细看了问题再回复啊?我相信我描述的已经很明白了。各位不要避重就轻啊!
lz 这个问题挺早就有相关的讨论。实际上就是存储过程编译以及查找对应执行计划的优化过程的理解。 update 的差异可以理解为存储过程,“第一次”被调用后,缓存下来的执行计划复用而带来的时间优势(节约了编译等时间) insert 的类似,则是参数嗅探的问题。也就是说,sql server 在执行存储过程中的语句时,对应参数进行嗅探,会产生不同的选择性估计值,根据其内部的优化方案,进行执行计划的选择。最明显一个例子就是 @date 一个时间变量。 lz可以查看一下参数嗅探这部分内容。 最后,还是建议lz看一下执行计划,毕竟这个是具体语句不同可观察的部分。也比较直接。
内容概要:本文围绕“【EI复现】考虑灵活性的数据心微网两阶段鲁棒规划方法(Matlab代码实现)”展开,提出了一种针对数据心微电网的两阶段鲁棒优化规划模型,重点考虑系统在运行过程面临的灵活性需求与不确定性因素。该方法通过构建第一阶段的投资决策与第二阶段的运行调整机制,有效应对源荷双重不确定性,提升微网系统的可靠性与经济性。文采用鲁棒优化理论处理不确定性,并结合Matlab编程实现完整的模型求解流程,提供了可复现的算法代码,便于科研人员验证与拓展。该研究对于高比例可再生能源接入背景下的数据心能源系统规划具有重要参考价值。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础,从事微电网、综合能源系统、鲁棒优化等相关领域研究的研究生、科研人员及工程技术人员(尤其适合有1-3年科研经验者);; 使用场景及目标:① 掌握两阶段鲁棒优化在微网规划的建模思路与数学表达;② 学习如何将灵活性指标融入能源系统规划模型;③ 复现EI级别高水平论文的核心算法,提升科研能力与论文作水平;④ 为后续开展数据心、智能微网、不确定性优化等方向的研究提供技术积累与代码基础; 阅读建议:建议读者结合文提供的Matlab代码逐行分析,理解两阶段鲁棒优化的建模技巧与求解流程,重点关注不确定性集的构建、列与约束生成(C&CG)算法的实现逻辑,并尝试对模型参数或结构进行修改以观察结果变化,从而深化对鲁棒优化机制的理解。
内容概要:本文围绕具有源荷不平衡特性的配电网,研究智能软开关(Soft Open Point, SOP)与储能系统(Energy Storage System, ESS)的联合规划方法。通过构建优化模型,综合考虑配电网分布式电源出力与负荷需求之间的时空不匹配问题,利用智能软开关灵活调节功率流动的能力以及储能系统的能量时移特性,实现对配电网潮流的有效调控,提升系统运行的经济性与可靠性。文采用Matlab进行仿真编程,验证所提联合规划方案在降低网络损耗、改善电压质量、提高可再生能源消纳能力等方面的优越性能。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的高校研究生、科研人员以及从事智能配电网规划与运行工作的工程技术人员。; 使用场景及目标:①解决高比例分布式可再生能源接入背景下配电网源荷不平衡导致的电压越限与潮流倒送问题;②优化配置智能软开关与储能的位置和容量,以实现系统综合成本最小化与运行性能最优化;③为新型配电系统柔性元件的协同规划提供技术参考与仿真工具支持。; 阅读建议:此资源以Matlab代码实现为核心载体,建议读者在理解数学模型与物理机理的基础上,结合实际算例(如IEEE 33节点系统)进行代码调试与结果分析,进一步掌握SOP与储能协同作用的内在机制,并可在此基础上拓展多目标优化、不确定性建模等高级功能。

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧