在会话中多次更新“SiteVisit”行的注意事项

时间:2008-10-29 06:33:09

标签: sql-server-2005 session performance

SQL Server 2005:

我有一个SiteVisit行,其中包含有关用户访问的信息,例如HttpRefer,是否下了订单,浏览器等。

目前,我正在使用SiteEvent加入此表,其中包含有关每个“访问过的部分”的信息。然后生成一个视图,显示每个用户访问过多少个部分的统计信息。显然,这不是一种可行的方法,现在我正在做一些重构。

我想将SectionsVisited列从我的视图移动到SiteVisit中的实际列。每次用户进入该会话时,我都会更新它。

现在我的实际问题: 每次会话多次更新行时,我需要考虑哪些注意事项。显然我在该行上有一个索引(当前由GUID索引以防止大多数恶意篡改)。

我只是想知道我应该做什么非显而易见的事情(如果有的话)。我是否应该采取任何具体措施来优化表格,或者SQL Server 2005是否会照顾好自己

注意:这是一个Flash网站,所以请不要只推荐一个跟踪工具。我想做点儿 '疯狂'数据挖掘,并开发了这样的跟踪。这主要是为了成为数据库问题而不是关于“如何跟踪”的问题。

请求的表定义:

USE [RazorSite]
GO
/****** Object:  Table [dbo].[SiteVisit]    Script Date: 10/29/2008 14:35:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[SiteVisit](
    [SiteVisitId] [int] IDENTITY(1,1) NOT NULL,
    [SiteUserId] [int] NULL,
    [ClientGUID] [uniqueidentifier] ROWGUIDCOL  NULL CONSTRAINT [DF_SiteVisit_ClientGUID]  DEFAULT (newid()),
    [ServerGUID] [uniqueidentifier] NULL,
    [UserGUID] [uniqueidentifier] NULL,
    [SiteId] [int] NOT NULL,
    [EntryURL] [varchar](100) NULL,
    [CampaignId] [varchar](50) NULL,
    [Date] [datetime] NOT NULL,
    [Cookie] [varchar](50) NULL,
    [UserAgent] [varchar](255) NULL,
    [Platform] [int] NULL,
    [Referer] [varchar](255) NULL,
    [RegisteredReferer] [int] NULL,
    [FlashVersion] [varchar](20) NULL,
    [SiteURL] [varchar](100) NULL,
    [Email] [varchar](50) NULL,
    [FlexSWZVersion] [varchar](20) NULL,
    [HostAddress] [varchar](20) NULL,
    [HostName] [varchar](100) NULL,
    [InitialStageSize] [varchar](20) NULL,
    [OrderId] [varchar](50) NULL,
    [ScreenResolution] [varchar](50) NULL,
    [TotalTimeOnSite] [int] NULL,
    [CumulativeVisitCount] [int] NULL CONSTRAINT [DF_SiteVisit_CumulativeVisitCount]  DEFAULT ((0)),
    [ContentActivatedTime] [int] NULL CONSTRAINT [DF_SiteVisit_ContentActivatedTime]  DEFAULT ((0)),
    [ContentCompleteTime] [int] NULL,
    [MasterVersion] [int] NULL CONSTRAINT [DF_SiteVisit_MasterVersion]  DEFAULT ((0)),
 CONSTRAINT [PK_SiteVisit] PRIMARY KEY CLUSTERED 
(
    [SiteVisitId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[SiteVisit]  WITH CHECK ADD  CONSTRAINT [FK_SiteVisit_Platform] FOREIGN KEY([Platform])
REFERENCES [dbo].[Platform] ([PlatformId])
GO
ALTER TABLE [dbo].[SiteVisit] CHECK CONSTRAINT [FK_SiteVisit_Platform]
GO
ALTER TABLE [dbo].[SiteVisit]  WITH CHECK ADD  CONSTRAINT [FK_SiteVisit_Site] FOREIGN KEY([SiteId])
REFERENCES [dbo].[Site] ([SiteId])
GO
ALTER TABLE [dbo].[SiteVisit] CHECK CONSTRAINT [FK_SiteVisit_Site]
GO
ALTER TABLE [dbo].[SiteVisit]  WITH CHECK ADD  CONSTRAINT [FK_SiteVisit_SiteUser] FOREIGN KEY([SiteUserId])
REFERENCES [dbo].[SiteUser] ([SiteUserId])
GO
ALTER TABLE [dbo].[SiteVisit] CHECK CONSTRAINT [FK_SiteVisit_SiteUser]

当前索引:

IX_CampaignId - non unique, non clustered
IX_ClientGUID - Unique, non clustered     <-- this is how a user is identified for updates
IX_UserGUID - non unique, non clustered
PK_SiteVisit - (SiteVisitId column) - clustered

1 个答案:

答案 0 :(得分:0)

我能给出的最佳建议是:保持桌面小。

如何?有一个表包含所有“实时”数据,即活动会话。会话到期时:将数据移出“存档”表或甚至其他数据库服务器进行挖掘。

“实时”表(会话ID)上只有极少数索引。您可以在“存档”表中获得所需的所有索引,以便更快地恢复数据。