使用SQL Server2005觸發(fā)器做站點(diǎn)IP、PV預(yù)統(tǒng)計(jì)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
上圖是一個(gè)WEB站點(diǎn)訪問日志表,記錄了訪問對(duì)象的相關(guān)信息。現(xiàn)在要求增加一個(gè)站點(diǎn)每天的IP、PV統(tǒng)計(jì)功能,數(shù)據(jù)量小時(shí)直接對(duì)Web_AccessLogTB表中的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)即可,若數(shù)據(jù)量比較大,這樣做就不合適了。解決方法是進(jìn)行預(yù)統(tǒng)計(jì):在用戶查看統(tǒng)計(jì)之前就已經(jīng)預(yù)先統(tǒng)計(jì)好了,用戶查看時(shí)只是顯示下結(jié)果而已。 預(yù)統(tǒng)計(jì)的方式又可分成兩種:同步或異步。同步可以寫個(gè)存儲(chǔ)過(guò)程來(lái)完成,添加訪問日志的同時(shí)進(jìn)行預(yù)統(tǒng)計(jì);異步是將添加訪問日志和預(yù)統(tǒng)計(jì)兩個(gè)過(guò)程分開,后者可由其他程序來(lái)完成,例如Windows服務(wù)、觸發(fā)器等等。顯然異步比較合適,下邊我們就用觸發(fā)器來(lái)完成。 上圖為預(yù)統(tǒng)計(jì)表,記錄每天的IP和PV量。現(xiàn)在要解決的一個(gè)問題是IP的統(tǒng)計(jì),到目前為止,每個(gè)IP都必須先掃描一次Web_AccessLogTB表,才知道它是不是首次訪問,是則IPCount字段加1,這樣效率太差了。我們?cè)俳ㄒ粋€(gè)輔助表(Web_IPLogTB)來(lái)解決這個(gè)問題: Web_IPLogTB表記錄每天的訪問IP,一個(gè)IP只記錄一次,每天清空一次,這樣掃描就快多了。下邊是我們的觸發(fā)器: 程序代碼
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 該文章在 2011/3/13 0:31:21 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |