木子屋 Dnawo's BLOG

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

👤 dnawo 📅 2010-04-07 👁 5019 👍 0 💬 0 🔄 来源:本站原创
图片

上图是一个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)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 Sql日期去掉时分秒 下一篇 → 从DateTime.TryParseExact想到的