以下存储过程是鄙人前几日发问的那个在线招聘考试系统上用到的存储过程之一,且看该存储过程的书写:

 1/**//*
 2---------------------------------------------------------------------------------
 3--存储过程名:pro_stuAnswerTime
 4--输入参数:
 5  --@RecruID 招聘ID
 6  --@TestID  考试ID
 7  --@PaperID 试卷ID
 8  --@StuID   考生ID
 9    @SpentHours 剩余小时,
10    @SpentMinutes 剩余分钟,
11    @SpentSeconds 剩余秒
12--输出参数:
13  --@IsPassedTime 是否超时
14------------------
15------------------
16--用途:
17--考生考试用时处理
18
19---------------------------------------------------------------------------------
20*/
21
22CREATE PROCEDURE dbo.pro_stuAnswerTime 
23    @RecruID int,
24    @TestID int,
25    @PaperID int,
26    @StuID int,
27    @SpentHours int,
28    @SpentMinutes int,
29    @SpentSeconds int
30AS
31    --更新考生用时表
32    if (select count(*) from Tb_StuTestRecord where  RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID) =0
33        begin 
34            insert into Tb_StuTestRecord(RecruID,TestID,PaperID,StuID,SpentHours,SpentMinutes,SpentSeconds) values(@RecruID,@TestID,@PaperID,@StuID,@SpentHours,@SpentMinutes,@SpentSeconds)
35        end
36    else
37        begin
38            update Tb_StuTestRecord set SpentHours=SpentHours+@SpentHours,SpentMinutes=SpentMinutes+@SpentMinutes,SpentSeconds=SpentSeconds+@SpentSeconds 
39            where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID;
40            
41            
42            
43        --以下代码用来进行 分 秒 的转换
44        --即60秒 换做一分,60分换做一秒
45         declare @min int;
46         declare @seconds int;
47         
48         --从表中查出相应的秒来判断
49         select @seconds=SpentSeconds from Tb_StuTestRecord
50         where  RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID
51         
52         --秒大于60
53         if @seconds>=60 
54            begin
55                    update Tb_StuTestRecord set SpentMinutes=SpentMinutes+1,SpentSeconds=0
56                where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID;
57            end
58        
59         --从表中查出相应的分来判断
60         select @min=SpentMinutes from Tb_StuTestRecord
61         where  RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID
62         --分钟大于60
63         if @min>=60
64            begin 
65                update Tb_StuTestRecord set SpentHours=SpentHours + 1,SpentMinutes=0 where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID;
66            end
67        
68    end
69

且看一下该存储过程对数据表访问了几次:
1.第32行,先从表中查出了一条记录,查询一次
2.如果走分支一的话,则只对表进行一次更新
3.如果走分支二,则会出现如下情况:
    3.1 更新一次表
    3.2 如果秒大于60,则又更新一次表
    3.3 如果分大于60,则第三次更新表

综上,对数据表的访问的最大次数可能达到1+1+1+1=4次,其中一次查询、三次更新,那么这样的效率肯定是比较低的。

针对以上存储过程,采取了网友们的建议,对以上存储过程进行了如下优化:

 1
 2declare @hour int;
 3declare @min int;
 4declare @sec int;
 5declare @affectedrowscount int;--表示是否更新的学生考试表(如果其值为0,则说明应该向该表中插入记录)
 6
 7--从表中查出考生已用时、分、秒
 8select @hour=SpentHours,@min=SpentMinutes,@sec=SpentSeconds from Tb_StuTestRecord
 9         where  RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID
10        
11        --声明更新之后应该是的时分秒
12        declare @okhour int;
13        declare @okmin int;
14        declare @oksec int;
15        
16        set @okhour=@hour+@SpentHours;
17        set @okmin = @min + @SpentMinutes;
18        set @oksec= @sec + @SpentSeconds;
19
20    if @oksec>=60
21    begin 
22        set @okmin = @okmin +1;
23        set @oksec = @oksec -60;
24    end
25
26    if @okmin>=60
27    begin
28        set @okhour = @okhour +1;
29        set @okmin = @okmin  - 60;
30    end
31    
32        update Tb_StuTestRecord set SpentHours=@okhour,SpentMinutes=@okmin,SpentSeconds=@oksec where RecruID=@RecruID and TestID=@TestID and PaperID=@PaperID and StuID=@StuID;
33        
34        --取出受影响的行数,作为下面的一个判断条件
35         set @affectedrowscount = @@rowcount;
36
37--如果更新时影响的行数为0,则说明表中并无该记录,此时应
38    if(@affectedrowscount = 0)
39        begin 
40                insert into Tb_StuTestRecord(RecruID,TestID,PaperID,StuID,SpentHours,SpentMinutes,SpentSeconds) values(@RecruID,@TestID,@PaperID,@StuID,@SpentHours,@SpentMinutes,@SpentSeconds)
41        end
42GO

且看优化后的存储过程:
1.第8 行从数据库中查询出相应的记录,并赋值给三个相应的变量
2.更新一次表
3.如果更新影响的行数为0,则向数据库中插入记录(此分支在考生答题的整个过程中只可能走一次)

由此:整个存储过程对该表进行了相当于2次的访问,其中一次查询,一次更新

比之第一个存储过程,优化之后的存储过程减少了三次的对数据更新的次数。
对于为什么减少了数据表的更新次数,请大家看存储过程。在此鄙人就不啰嗦了。

提升存储过程的效率,用减少表的更新次数来实现相关推荐

  1. 如何运用政务智慧引导系统提升群众办事效率

    近期在室内导航系统的基础上,结合办事大厅的需求,推出了政务智慧引导系统,提升群众办事效率,减少工作人员工作量.今天就跟大家介绍一下部分功能. 一.项目背景 在2021年8月,四川就深化政务公开促进基层 ...

  2. 基于主动学习算法减少人工标注量,提升文本标注效率的方案探究

    基于主动学习算法减少人工标注量,提升文本标注效率的方案探究 阅读 451 收藏 23 2018-06-26 原文链接:yq.aliyun.com OPPO技术开放日第三期,未来的探索 · AI& ...

  3. 性能:如何减少延迟提升内存分配效率

    内存是如何影响性能的 缓存命中率 缓存(CPU Cache)是CPU和内存之间的临时数据交换器,是为了解决CPU运行处理速度和内存读写速度不匹配而设计的 随着多核CPU的发展,CPU缓存通常分成了三个 ...

  4. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  5. 运用PARALLEL方式成倍提升Oracle数据分析效率

    运用PARALLEL方式成倍提升Oracle数据分析效率 Oracle作为一种大型数据库,在我国已成为大型企事业单位(如公立医院)的主流数据库并占有了绝对的市场份额.这就意味着审计工作同Oracle的 ...

  6. 一文解读广告投放全攻略,提升拓客效率

    每家公司都绕不开的一个命题是--用户从哪来?伴随互联网生态的发展,以效果广告获取用户的方式越来越成为企业高效获客和营收增长的手段.如何更好地进行广告投放,成为一个值得探讨的话题. 本文聚焦数字营销中的 ...

  7. 打造数字化工作平台,提升内外协同效率

    近年来,受疫情的影响,远程办公市场需求集中爆发,协同办公系统逐渐成为各行各业的办公标配,很多企业也通过协同办公这个突破口,走上了数字化转型之路. 深圳九方软件有限公司(以下简称:九方软件)是一家专业从 ...

  8. 银行如何借助数据分析提升业务运营效率

    刚刚过去的2020年,对银行业而言是充满挑战的一年.疫情影响下,银行业在经营业绩.业务模式.风控合规等方面遭遇前所未有的压力. 一方面,全球经济受到冲击,风险传导至银行体系,客观上导致银行的不良率和不 ...

  9. Lenovo x DorisDB:简化数据处理链路,极大提升BI分析效率

    Lenovo联晟智达隶属于全球PC领导厂商联想集团,致力于打造科技驱动.柔性敏捷.服务体验一流的智慧物流生态平台,面向产业端企业提供综合物流解决方案,成为服务于中国及全球客户的智能供应链科技企业.联晟 ...

  10. java怎么读取word某一页内容_Word页码设置的3点技巧,提高排版效率,减少不必要烦恼...

    在使用word中,经常会碰到设置页码的需求,无论是毕业论文.产品需求.开发说明书等等中经常要为文档设置页码. 怎么从第二页开始设置页码呢?怎么修改页码的样式,字体呢?今天给大家分享的是关于word中页 ...

最新文章

  1. 为什么不能在init和dealloc函数中使用accessor方法
  2. Java面向对象抽象类案例分析
  3. php xml 格式化,PHP实现浏览器格式化显示XML的方法示例
  4. 关于Python中迭代器的作用
  5. 2012-09-16-html
  6. 简单内网***刺探命令
  7. 纯新手DSP编程--5.18--调试
  8. CenterNet++ | CenterNet携手CornerNet终于杀回来了,实时高精度检测值得拥有!
  9. Redis系列八:redis主从复制和哨兵
  10. php libiconv close_PHP 5.3.10 编译安装时出现 undefined reference to `libiconv' 错误的解决方法...
  11. linux系统中查看系统内存或flash使用情况
  12. nfs总结之工作原理
  13. 网页打开慢/正在解析主机-解决
  14. 海康服务器如何设置通电自动开机,UNraid教程:教您设置自动关机功能!使用User Scripts插件 自动执行脚本 更省电!...
  15. Java经典“羊车门”概率问题解答
  16. mysql怎么退出当前表_MYSQL基本操作--登陆退出,数据库、表、字段的创建、查看、删除、更改...
  17. python与分形0000 - 分形世界
  18. python运行代码示例_python程序样例
  19. php农历代码,PHP阳历转农历实现代码
  20. java 文件预览_Java实现文件的预览

热门文章

  1. 水体专题提取与叶绿素a浓度反演
  2. 摄影测量学之航片中重要的点线面
  3. 回顾 | Apache Flink 1.9 版本新特性强势预告!(内含PPT下载链接)
  4. Flink大数据计算的机遇与挑战
  5. GitHub 标星 8w!这个开源面试总结屌爆了!
  6. oracle中某字段显示long,ORACLE的ALL_VIEWS数据字典text字段long类型问题
  7. 模块无法导入_你真的会用Python模块与工具包吗?
  8. 数字货币交易系统_符合数字货币市场的量化交易系统
  9. broker druid 查询_即时查询工具| Druid
  10. mysql xplugin_MySQL 5.7.12版本发布,更重要的是X Plugin也来了