我正在寻找一些建议。我有一个名为AuditLog
的SQL Server表,此表记录了我们的Web应用程序中发生的任何操作/更改。
我正在尝试构建一些报告,每当我尝试从此表中提取数据时,它会使我的查询从几秒钟到十分钟+。刚做一个
select * from dbo.auditlog
大约需要2小时+。
该表有7700万行并且正在增长。无论如何,目前只有想法是做一个索引,但这会减慢插入速度。不确定会影响性能的程度有多大,但却不予考虑。其他想法是分区表或执行索引视图,但我们正在运行SQL Server 2014 Standard Edition,并且不支持这些选项。
这是表create语句:
CREATE TABLE [dbo].[AuditLog]
(
[AuditLogId] [uniqueidentifier] NOT NULL,
[UserId] [uniqueidentifier] NULL,
[EventDateUtc] [datetime] NOT NULL,
[EventType] [char](1) NOT NULL,
[TableName] [nvarchar](100) NOT NULL,
[RecordId] [nvarchar](100) NOT NULL,
[ColumnName] [nvarchar](100) NOT NULL,
[OriginalValue] [nvarchar](max) NULL,
[NewValue] [nvarchar](max) NULL,
[Rams1RecordID] [uniqueidentifier] NULL,
[Rams1AuditHistoryID] [uniqueidentifier] NULL,
[Rams1UserID] [uniqueidentifier] NULL,
[CreatedBy] [uniqueidentifier] NULL,
[CreatedDate] [datetime] NULL DEFAULT (getdate()),
[OriginalValueNiceName] [nvarchar](100) NULL,
[NewValueNiceName] [nvarchar](100) NULL,
CONSTRAINT [PK_AuditLog]
PRIMARY KEY CLUSTERED ([TableName] ASC, [RecordId] ASC, [AuditLogId] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[AuditLog] WITH NOCHECK
ADD CONSTRAINT [FK_AuditLog_User]
FOREIGN KEY([UserId]) REFERENCES [dbo].[User] ([UserID])
GO
ALTER TABLE [dbo].[AuditLog] CHECK CONSTRAINT [FK_AuditLog_User]
GO
ALTER TABLE [dbo].[AuditLog] WITH NOCHECK
ADD CONSTRAINT [FK_AuditLog_UserCreatedBy]
FOREIGN KEY([CreatedBy]) REFERENCES [dbo].[User] ([UserID])
GO
ALTER TABLE [dbo].[AuditLog] CHECK CONSTRAINT [FK_AuditLog_UserCreatedBy]
GO
答案 0 :(得分:0)
有些东西很大,你可能会尝试一些东西。
分区视图基本上会破坏你的表,实际上是基于日期或类型或对象的较小的有意义的表,或者你经常访问它。然后将每个表分别编入索引,为您提供更好的统计数据,如果您在2012或更高版本中,您可以利用ColumnStore,假设您使用DATE之类的东西对数据进行分组。
创建一个跨所有表的视图,然后根据视图进行报告。由于您已经按照MOST经常访问的方式对数据进行了分组,因此您的过滤器将采用与分区排除相似的方式,让您更快地获取数据。
当然,这将导致更多的维护和一些代码更改,但如果您将大量数据存储在一个表中,那么值得付出努力。