我有一个'SessionVisit'表,用于收集有关用户访问的数据。 该表的脚本如下。每天可能会添加25,000行。
表CREATE语句如下。就理解这种模式的含义而言,我的数据库知识肯定不是最新的。
任何人都可以就其中一些问题向我提出2c建议:
我知道这在性质上相当普遍。任何“明显的”或非显而易见的信息都将受到赞赏。
这是表格:
USE [MyDatabase]
GO
/****** Object: Table [dbo].[SessionVisit] Script Date: 06/06/2009 16:55:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[SessionVisit](
[SessionGUID] [uniqueidentifier] NOT NULL,
[SessionVisitId] [int] IDENTITY(1,1) NOT NULL,
[timestamp] [timestamp] NOT NULL,
[SessionDate] [datetime] NOT NULL CONSTRAINT [DF_SessionVisit_SessionDate] DEFAULT (getdate()),
[UserGUID] [uniqueidentifier] NOT NULL,
[CumulativeVisitCount] [int] NOT NULL CONSTRAINT [DF_SessionVisit_CumulativeVisitCount] DEFAULT ((0)),
[SiteUserId] [int] NULL,
[FullEntryURL] [varchar](255) NULL,
[SiteCanonicalURL] [varchar](100) NULL,
[StoreCanonicalURL] [varchar](100) NULL,
[CampaignId] [int] NULL,
[CampaignKey] [varchar](50) NULL,
[AdKeyword] [varchar](50) NULL,
[PartnerABVersion] [varchar](10) NULL,
[ABVersion] [varchar](10) NULL,
[UserAgent] [varchar](255) NULL,
[Referer] [varchar](255) NULL,
[KnownRefererId] [int] NULL,
[HostAddress] [varchar](20) NULL,
[HostName] [varchar](100) NULL,
[Language] [varchar](50) NULL,
[SessionLog] [xml] NULL,
[OrderDate] [datetime] NULL,
[OrderId] [varchar](50) NULL,
[utmcc] [varchar](1024) NULL,
[TestSession] [bit] NOT NULL CONSTRAINT [DF_SessionVisit_TestSession] DEFAULT ((0)),
[Bot] [bit] NULL,
CONSTRAINT [PK_SessionVisit] PRIMARY KEY CLUSTERED
(
[SessionGUID] 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].[SessionVisit] WITH CHECK ADD CONSTRAINT [FK_SessionVisit_KnownReferer] FOREIGN KEY([KnownRefererId])
REFERENCES [dbo].[KnownReferer] ([KnownRefererId])
GO
ALTER TABLE [dbo].[SessionVisit] CHECK CONSTRAINT [FK_SessionVisit_KnownReferer]
GO
ALTER TABLE [dbo].[SessionVisit] WITH CHECK ADD CONSTRAINT [FK_SessionVisit_SiteUser] FOREIGN KEY([SiteUserId])
REFERENCES [dbo].[SiteUser] ([SiteUserId])
GO
ALTER TABLE [dbo].[SessionVisit] CHECK CONSTRAINT [FK_SessionVisit_SiteUser]
答案 0 :(得分:1)
好吧,我建议不要在每页上插入几k数据!
我要做的第一件事就是看看我可以从第三方分析工具获得多少这些信息,或许可以结合日志分析。这应该可以让你删掉很多字段。
25k插入一天并不多,但是这里的问题是你的网站越忙,这将对数据库产生的负载越多。也许您可以构建一个批处理写入的排队系统,但实际上,大部分信息已经存在于日志中。
答案 1 :(得分:1)
我看到SessionGUID和SessionVisitId,为什么在同一个表上同时具有uniqueidentifier和Identity(1,1)?对我来说似乎多余。
我看到referer和knownrefererid,如果可能的话,考虑从已知的引用中获取引用者。这有助于减少多余的写入。
我看到了campaignkey和campaignid,如果可能,请再次从广告系列表中获取。
我看到了orderid和orderdate。我确定你可以从订单表中获取订单日期,对吗?
我看到hostaddress和hostname,你真的需要这个名字吗?通常,主机名没有多大用处,容易产生误导。
我看到多个日期和时间戳,这是否重复?
那个SessionLog专栏怎么样?我看到它是XML。它是否是大量数据,您可能已经在其他列中拥有的数据?如果是这样,摆脱XML或重复的列。使用SQL 2008,您可以在报告时解析该XML列中的数据,并可能消除一些额外的列(因此写入)。当开发人员为该XML添加更多内容时,您将来会遇到麻烦吗?对我而言,XML只是尖叫着“大量的过度写作”。
米奇说要删除主键。我个人会把索引留在桌子上。由于它是集群的,因此有助于加快写入时间,因为DB将始终在磁盘上的表末尾写入新行。
删除一些重复的信息,你可能会在每次访问时写一行。
答案 2 :(得分:0)
Agre和Chris一起使用日志分析可能会更好(查看Microsoft的免费Log Parser)
如果失败,我会从SessionVisit表中删除外键约束。
你提到了rowsize;表中的varchar不会预先分配到它们的最大长度(对于空字段(大约),更多4 + 4个字节)。但是说,一般规则是尽可能保持行“精益”。
另外,我会从SessionGUID(GUID)列中删除主键。它对你没有多大帮助。
答案 3 :(得分:0)
那个表中也有很多空值。我认为你应该将必须同时为非null的列组合在一起。实际上,您应该对正在编写的数据进行更好的分析,而不是将它们全部集中在一个表中。