从38GB SQL表中检索数据的速度很慢

时间:2015-12-09 20:17:54

标签: sql-server

我正在寻找一些建议。我有一个名为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

1 个答案:

答案 0 :(得分:0)

有些东西很大,你可能会尝试一些东西。

  1. 您需要做的第一件事是定义如何相应地访问表格MOST的时间和索引。
  2. 我希望你不要在没有任何过滤报告解决方案的情况下从AuditLog做一个select * - 它甚至不应该是一个选项。
  3. 最后,您可以考虑使用分区视图,而不是索引视图或分区。
  4. 分区视图基本上会破坏你的表,实际上是基于日期或类型或对象的较小的有意义的表,或者你经常访问它。然后将每个表分别编入索引,为您提供更好的统计数据,如果您在2012或更高版本中,您可以利用ColumnStore,假设您使用DATE之类的东西对数据进行分组。

    创建一个跨所有表的视图,然后根据视图进行报告。由于您已经按照MOST经常访问的方式对数据进行了分组,因此您的过滤器将采用与分区排除相似的方式,让您更快地获取数据。

    当然,这将导致更多的维护和一些代码更改,但如果您将大量数据存储在一个表中,那么值得付出努力。