数据定时统计方法之浅见
1 概述
SQLServer数据库是Microsoft公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98的膝上型电脑到运行Microsoft Windows 2012的大型多处理器的服务器等多种平台使用。目前最新版本是SQLServer2012。本文主要针对日常工作中比较常用版本SQLServer2005进行分析,研究其数据定时统计的相关方法,并附实例加以说明。
2 软件项目数据统计中遇到的问题
在日常工作中,我们会经常遇到类似于这样的问题:“一张统计报表需要从十几张,甚至几十张业务基础数据表中汇总。”传统的处理方法是直接拼接SQL查询语句,然后将查询结果传递给报表控件,这样的处理方法看似没有问题,但随着业务数据的不断增加,用户打开报表的速度越来越慢,最后报表直接无法打开或者打开需要很长时间,从而导致整个项目的用户体验大
打折扣。
3 数据定时统计方法的研究
面对这一问题,我们可以采用数据定时统计的方法将基础业务数据的统计结果保存在一张业务表中,然后数据报表直接从统计结果表中获取数据,如此一来,数据统计效率大大提升,同时也简化了报表编码的复杂度。
我们在SQLServer2005中编写基础业务数据统计视图,然后建立与视图结构一致的数据表,同时编写存储过程将视图统计的结果性数据同步到结果表中,最后采用SQLServer2005的定时任务,定期执行同步数据的存储过程即可,具体实现方法及步骤,如图1所示。
案例说明:
定时统计各单位累计消费情况:
第一步:创建视图
CREATE VIEW [V_ORG_ CONSUME]
AS
SELECT O.CODE_,O.NAME_, SUM(C.MONEY_) AS TOTALMONEY_
FROM T_ CONSUME AS C
LEFT JOIN T_ACTOR AS A ON A.ID=C.ACTORID_
LEFT JOIN T_ACTOR_ORG AS AO A.ID=AO.ACTORID_
LEFT JOIN T_ORG AS O ON AO.ORGID_=O.ID
GROUP BY O.ID,O.CODE_,O.NAME_
ORDER BY ID
第二步:创建统计结果表
CREATE TABLE [TV_ORG_ CONSUME](
[ID] [bigint] NOT NULL,
[CODE_] [varchar](100) NULL,
[NAME_] [varchar](200) NULL,
[TOTALMONEY_] [float]NULL
PRIMARY KEY CLUSTERED
([ID]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
windows server 2012四个版本第三步:创建数据同步存储过程
数据同步插入存储过程:
Create procedure [P_ORG_ CONSUME_INSERT]
@ID int,
@CODE_ varchar,
@NAME_ varchar,
@TOTALMONEY_ decimal(18, 10)
as
declare @sum int
begin tran
insert into TV_ORG_ CONSUME(ID,CODE_,NAME_, TOTALMONEY_)
values(@ID,@ CODE_,@ NAME_,@ TOTALMONEY_)
select @sum = count(*) from TV_ ORG_ CONSUME where (ID=@ID)
if(@sum>1)
begin
raiserror(‘记录已经存在',16,8)
rollback tran——回滚事物
end
else
commit tran——提交事务
创建返回游标的存储过程:
Create procedure [P_ ORG_ CONSUME_GET]
@VChcekCursor Cursor Varying Output
As
Set @VChcekCursor = Cursor
For
SelectID, CODE_,NAME_, TOTALMONEY_
from V_ORG_ CONSUME
Open @VChcekCursor
执行数据同步插入的存储过程:
Create procedure[P_ORG_ CONSUME_INSERT_EXCUTE]
As
Declare @ID int
Declare @ CODE_varchar
Declare @ NAME_varchar
Declare @ TOTALMONEY_decimal(18, 10)
Exec P_ORG_CONSUME_GET @VChcekCursor out
Fetch Next From @VChcekCursor
InTo @ID,@ CODE_,@ NAME_,@ TOTALMONEY_
While(@@Fetch_Status = 0)
Begin
exec[P_ORG_CONSUME_INSERT]
@ID,@ CODE_,@ NAME_,@ TOTALMONEY_
Fetch Next From @VChcekCursor
InTo @ID,@ CODE_,@ NAME_,@ TOTALMONEY_
End
Close @VChcekCursor
Deallocate@VChcekCursor
Go
第四步:创建任务定时执行存储过程
DECLARE @jobId BINARY(16)
EXEC @ReturnCode=
msdb.dbo.sp_add_job @job_name=N’Job_Consume_Excute_Procedure’,
@enabled=1,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论