2015-12-09 4 views
0

Я ищу советы. У меня есть таблица SQL Server, называемая AuditLog, и эта таблица записывает любые действия/изменения, которые происходят с нашей БД из нашего веб-приложения.Медленное извлечение данных из таблицы 38GB SQL.

Я пытаюсь создать несколько отчетов, и в любое время, когда я пытаюсь извлечь данные из этой таблицы, мой запрос запускается от секунд до 10 минут +. Только что делает

select * from dbo.auditlog 

занимает около 2 часов +.

В таблице содержится 77 миллионов строк и растет. Во всяком случае, только мысли в этот момент - делать индекс, но это замедляет вставки. Не уверен, насколько это повлияет на производительность, но сдерживается. Другие мысли заключались в разделении таблицы или представлении индекса, но мы используем SQL Server 2014 Standard Edition, и эти параметры не поддерживаются.

Вот таблица создать заявление:

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

Похоже, вам нужны некоторые индексы - см. Http://basitaalishan.com/2013/03/13/find-missing-indexes-using-sql-servers-index-related-dmvs/ –

+0

Я вижу, t есть любые столбцы IDENTITY. Это означает, что вставки являются односторонними к базе данных, а не наоборот, чтобы получить выданный ключ. Это означает, что крошечное ухудшение производительности, которое дополнительные клавиши будут использовать при вставках, не повлияет на время отклика и общую производительность сервера баз данных, если ваш сервер уже не работает на полную мощность. Работает ли он на полную мощность? –

+0

Нет. Сервер БД почти не работает. – user2262706

ответ

0

С чем-то, что большой есть несколько вещей, которые вы могли бы попробовать.

  1. Первое, что вам нужно сделать, это определить, как вы получаете доступ к таблице MOST времени и индекса соответственно.
  2. Я надеюсь, что вы не сделаете выбор * из AuditLog без какой-либо фильтрации для решения для отчетности - это даже не вариант.
  3. Наконец, вместо индексированных представлений или разбиения на разделы вы можете рассмотреть секционированное представление.

Разделенный вид в основном разбивает ваш стол вверх, физически на меньшие значащие таблицы - на основе даты или типа или объекта, или, тем не менее, вы МОЖЕТЕ часто обращаться к нему. Каждая таблица затем индексируется отдельно, давая вам гораздо лучшую статистику, и если вы в 2012 году или выше можете использовать ColumnStore, предполагая, что вы используете что-то вроде DATE для группировки данных.

Создайте представление, которое охватывает все таблицы, а затем отчитывается на основе представления. Поскольку вы уже сгруппировали свои данные по тому, как вы МОСТ часто будете обращаться к нему, ваш фильтр будет действовать аналогично исключению раздела и быстрее приведет к вашим данным.

Конечно, это приведет к небольшому увеличению обслуживания и некоторому изменению кода, но приложите все усилия, если вы храните столько данных и больше в одной таблице.

+0

То, как я присоединяюсь к этой таблице, является RecordId, и я сказал select * как пример того, насколько он медленный. Я никогда не использую его. Я извлекаю только одно или два значения из этой таблицы, но даже при этом. Он заставит мой запрос работать от секунд до 10-15 минут. Тем не менее, я обязательно посмотрю на секционированный вид и посмотрю, как эти функции. Спасибо за вход! – user2262706

Смежные вопросы