欢迎光临

木子屋

标题: 使用SQL Server2005触发器做站点IP、PV预统计

作者: dnawo

日期: 2010-04-07 04:06 PM

分类: 服务器

内容:
上图是一个WEB站点访问日志表，记录了访问对象的相关信息。现在要求增加一个站点每天的IP、PV统计功能，数据量小时直接对Web_AccessLogTB表中的数据进行统计即可，若数据量比较大，这样做就不合适了。解决方法是进行预统计：在用户查看统计之前就已经预先统计好了，用户查看时只是显示下结果而已。
预统计的方式又可分成两种：同步或异步。同步可以写个存储过程来完成，添加访问日志的同时进行预统计；异步是将添加访问日志和预统计两个过程分开，后者可由其他程序来完成，例如Windows服务、触发器等等。显然异步比较合适，下边我们就用触发器来完成。
上图为预统计表，记录每天的IP和PV量。现在要解决的一个问题是IP的统计，到目前为止，每个IP都必须先扫描一次Web_AccessLogTB表，才知道它是不是首次访问，是则IPCount字段加1，这样效率太差了。我们再建一个辅助表(Web_IPLogTB)来解决这个问题：
Web_IPLogTB表记录每天的访问IP，一个IP只记录一次，每天清空一次，这样扫描就快多了。下边是我们的触发器：
复制内容到剪贴板 程序代码Create TRIGGER [Web_UpdateIPAndPVTG]
ON [dbo].[Web_AccessLogTB]
AFTER Insert
AS
BEGIN
IF @@rowcount>0
BEGIN
DECLARE @clientip nvarchar(50), @recdatetime datetime
DECLARE @ipcount int
Select @clientip=ClientIP,@recdatetime=RecDateTime FROM inserted
SET @recdatetime=DATEADD(day,DATEDIFF(day,0,@recdatetime),0)

IF NOT EXISTS(Select TOP 1 * FROM Web_AccessLog2TB Where RecdateTime=@recdatetime)
BEGIN--新增
Insert INTO Web_AccessLog2TB(RecDateTime,IPCount,PVCount) VALUES(@recdatetime,1,1)
TRUNCATE TABLE dbo.Web_IPLogTB --每天清空
Insert INTO dbo.Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE
BEGIN
Select @ipcount=count(1) FROM Web_IPLogTB Where RecdateTime>=@recdatetime AND ClientIP=@clientip
IF @ipcount=0
BEGIN--更新IP和PV
Update Web_AccessLog2TB SET IPCount=IPCount+1,PVCount=PVCount+1 Where RecdateTime=@recdatetime
Insert INTO Web_IPLogTB(RecDateTime,ClientIP) VALUES(@recdatetime,@clientip)
END
ELSE--只更新PV
Update Web_AccessLog2TB SET PVCount=PVCount+1 Where RecdateTime=@recdatetime
END
END
END

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.563 ms

返回

标题: 使用SQL Server2005触发器做站点IP、PV预统计

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.563 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.582 ms

返回