ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sqlserver2000中更新数据效率问题

sqlserver2000中更新数据效率问题

原创 Linux操作系统 作者:itkan 时间:2011-03-18 10:22:54 0 删除 编辑
问题描述:现sqlserver 2000数据库下有tJS007PregnantExamInfo表,数据量在400万左右。当向此表进行增、删、改的时候会调用其触发器来更新另一表(tJS008ExamValid)的数据。
具体如下:当tJS007PregnantExamInfo表中有以下数据:
主键                                                                         姓名       组内排序    查环时间
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    1    2008-06-02 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    2    2008-07-17 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    3    2008-08-06 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    4    2008-10-30 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e      张三    5    2010-03-20 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    6    2010-05-16 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    7    2010-08-13 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    8    2010-09-05 00:00:00.000

表tJS008ExamValid有以下数据
主键                                                                         姓名      应查次数     有效次数
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三      3
应查次数表示一年(不一定是自然年)中应该检查的次数。如一年需检查3次,那么间隔四个月的检查算有效,如果在四个月内检查了N次,也算一次。那么下一次有效就是在最近一次有效的时间上加上四个月才算第二次有效,依此类推。在tJS007PregnantExamInfo中的触发器会调用fnc_ExamValidNum函数来计算次数并更新tJS008ExamValid表中的"有效次数"列的值。

现在遇到的问题就是批量操作表tJS007PregnantExamInfo的速度很慢,是否有更好的方案来解决此问题。(注,表tJS007PregnantExamInfo的主键和tJS008ExamValid的主键都有索引)

函数fnc_ExamValidNum
CREATE          FUNCTION fnc_ExamValidNum
(
   @begindate varchar(50),
   @enddate varchar(50),
   @guid varchar(50),
   @flag int
)RETURNS int
AS
BEGIN
  declare @num int;
  set @num=0;
  declare @bmonth int
  set @bmonth=12/@flag
  declare @min_date datetime;
  declare @curr_date datetime;
  declare getDateByGuid cursor for select fExamdate from dbo.tJS007PregnantExamInfo(nolock) where  fpersonalguid=@guid and fIsDeleted='0' and fExamDate between @begindate and @enddate order by fexamdate
  OPEN getDateByGuid
  FETCH NEXT FROM getDateByGuid INTO @min_date;
  if(@min_date is not null)
    set @num=@num+1;
  WHILE @@fetch_status = 0
BEGIN
  FETCH NEXT FROM getDateByGuid INTO @curr_date;
  if datediff(month,@min_date,@curr_date)>=@bmonth
  begin
     set @num=@num+1;
     set @min_date=@curr_date;
  end
END
  CLOSE getDateByGuid
  DEALLOCATE getDateByGuid
  return @num
END

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22962593/viewspace-689832/,如需转载,请注明出处,否则将追究法律责任。

下一篇: mysql order by 问题
请登录后发表评论 登录
全部评论

注册时间:2009-12-24

  • 博文量
    6
  • 访问量
    18609