首页 > 数据库 >为什么sql server存储过程在ssms中执行很快,但是在jdbc调用时却又很慢?

为什么sql server存储过程在ssms中执行很快,但是在jdbc调用时却又很慢?

时间:2024-08-25 11:26:01浏览次数:10  
标签:存储 jdbc ssms server 调用 计划 执行

近几年老是不定期地遇到同一个问题,sql server的存储过程在ssms里执行很快,但是用jdbc调用就很慢。

今天仔细地研究了一下,发现问题的关键在于存储过程的执行计划。

存储过程在创建完之后,通常会被程序员用一组参数调用这个存储过程,查看能否执行。然而恰恰就是在这第一次在ssms里的调用,数据库会为这个存储过程创建一个执行计划。然后之后每次在ssms里的调用都会复用这个执行计划。所以,假如第一次调用使用的参数是一个异常值,那很有可能会让执行计划在遇到参数是正常值时的效率不是最高。以上只是在ssms中调用存储过程时观察到的现象。

假如是使用jdbc调用存储过程,那么jdbc使用的执行计划不是在ssms里第一次调用存储过程创建的那一个,而是这个存储过程在jdbc中第一次执行时创建的一个新的执行计划。所以假如使用jdbc调用存储过程,那么第一次用jdbc执行存储过程使用的参数必须是正常范围内的常见值,这样创建出来的执行计划才可以尽可能满足大多数正常范围内的参数值。

假如不希望存储过程复用执行计划,可以在create或者alter存储过程时加上with recompile,这样该存储过程在每次调用时都会重新根据实际的参数创建新的执行计划。这样做的好处是每次调用都是用的合适的执行计划,不会因为执行计划不匹配的问题导致执行很慢。缺点是每次都要生成一次执行计划,可能根据代码复杂度的不同产生长短不一的时间消耗。

可能有人会问,为什么jdbc调用存储过程没有复用ssms里调用存储过程时创建的执行计划。可能有人还会问,jdbc调用存储过程的执行计划会不会覆盖ssms调用存储过程的执行计划?这两个问题其实是同一个问题,它们的答案是:对于同一个存储过程,数据库会为ssms和jdbc创建两套执行计划。为了证明这一点,本文为ssms和jdbc的两套执行计划做了四组实验,分别是ssms低效-jdbc高效,ssms高效-jdbc低效,ssms低效-jdbc低效,ssms高效-jdbc高效。低效的执行计划可以用异常值参数生成。高效的执行计划可以用正常值参数生成。实验证明:每次实验中,同一个存储过程的两个执行计划可以同时存在。这就是为什么有时在ssms里执行很快,但是用jdbc调用就很慢的原因,是因为他们用的执行计划是不同的。

标签:存储,jdbc,ssms,server,调用,计划,执行
From: https://www.cnblogs.com/kokoworkhardandtryluck/p/18378754

相关文章

  • 【Spring Boot】整合JDBC
    SpringData简介1.对于数据访问层,无论是SQL(关系型数据库)还是NOSQL(非关系型数据库),SpringBoot底层都是采用SpringData的方式进行统一处理。2.SpringBoot底层都是采用SpringData的方式进行统一处理各种数据库,SpringData也是Spring中与SpringBoot、SpringClo......
  • sql server导入mysql,使用工具SQLyog
    概述需要将sqlserver的数据导入到mysql中,由于2种数据库存在各种差异,比如表字段类型就有很多不同,因此需要工具来实现。这里使用SQLyog来实现。 SQLyog安装安装过程参考文档:https://blog.csdn.net/Sunshine_liang1/article/details/84400820注意:版本不能太低,必须要有导入外......
  • SQL Server 2019及Solidworks 2022安装错误解决
    问题关键词:SQLServer2019;Solidworks2022;WaitontheDatabaseEnginerecoveryhandlefailed.TLDR:Windows11系统扇区过大导致SQLServer无法处理。参考这一个StackOverflow问题中的相关回答。问题解决(SQLServer2019安装问题):以管理员身份运行CommandPrompt或者......
  • 如何使用 SQL Server 内置函数实现MD5加密
    目录前言一、MD5加密1、MD5加密的特点2、MD5加密的应用场景3、为什么MD5有用二、使用MD5三、MD5加密示例 四、SQL截取字符串substring总结最后前言在互联网时代,我们的数据基本都是在暴露在外面,数据安全变得越来越重要。我们经常需要保护一些个人信息,比如密码......
  • SQL Server 数据库 优化 性能瓶颈
    优化sql查询,分库分表,读写分离。建立索引,分页,时间段不要太长(限制数量)。升级电脑:固态硬盘,多个cpu,万兆网口。超级大表等优化。一查询,磁盘100% lockselect*fromxx(nolock)预防为主,测试为重。建立模拟环境(测试环境),一模一样的应用环境,提前测试sql性能。真正生产中,没有时......
  • SQL Server查找哪些执行慢的语句
    1、根据https://learn.microsoft.com/zh-cn/troubleshoot/sql/database-engine/performance/troubleshoot-slow-running-queries网址提供的脚本。SELECTreq.session_id,req.total_elapsed_timeASduration_ms,req.cpu_timeAScpu_time_ms,req.total_......
  • JDBC和Mybatis的区别
    jdbc和mybatis的区别功能和用途‌JDBC和MyBatis的主要区别在于它们的功能和用途。‌‌JDBC(JavaDatabaseConnectivity)是Java提供的一套用于连接数据库的接口规范,它允许Java程序与数据库进行交互。JDBC是一个底层的数据库访问技术,开发人员需要手动编写SQL语句并处理结果集的转......
  • 敦煌智旅:Serverless 初探,运维提效 60%
    作者:百潼行业新趋势在后疫情时代,文旅行业开始复苏,在行业的发展趋势中,我们看到了一个充满机遇和挑战的未来。通过不断创新和适应市场需求,文旅行业继续不断发展壮大,为消费者提供更加丰富多样的旅游体验。与此同时,文旅行业也朝着科技融合,创新颠覆的趋势发展。科技带动产业向“新消......
  • usbserver某某达频繁掉狗问题排查(针对加密狗类型Elite5 3.X)
    近期反复收到客户反映加密狗频繁掉狗问题,这个掉狗并不是在盛讯美恒客户端usbovernetwork上频繁掉,在客户端显示稳如老狗,但是在工程软件使用端总是犹如跳梁小丑跳出未检测到加密狗,让人甚是苦恼!下面给出一个案例,提供大家参考,定位一下问题本着有病看医生的原则,咱们需要用自带的加......
  • 【Windows Server2016下Oracle11g DG配置实操步骤】
    WindowsServer2016下Oracle11gDG配置实操步骤文章目录WindowsServer2016下Oracle11gDG配置实操步骤前言一、部署规划1.1、虚拟机搭建:1.2、环境规划:1.3、主库操作系统配置1.4、数据库安装和实例创建1.5、监听配置1.6、网络配置1.7、克隆虚拟机二、主库配置2.1、查看......