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