问题描述:现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
具体如下:当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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22962593/viewspace-689832/