Построение отчета на основе данных большой таблицы, которая часто изменяется

Вводная в проблему

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

При построении отчетов по ней будут запросы будут медленно обрататывать.

Возможное решение - поставить индексы. Но это может негативно сказаться на быстродействии операций insert, update. В таблицу постоянно добавляются новые строки. 

Чем больше индексов, тем дольше будет выполняться insert. 

Как же быть? Без индексов совсем запрос не работает, а вешать индекс не хочется, чтобы не ухудшать опыт пользователя только для того, чтобы построить некие графики. 

Решение

На частодобавляемую таблицу мы не добавляем дополнительных индексов. Пусть операции insert выполняются максимально быстро.

А отчеты будем строить на основе другой таблицы, в которую данные периодически добавляются (например, 1 р в день). И в этой таблице будут все необходимые фильтры. 

Более того, данную таблицу можно вынести в отдельную базу данных. 

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

Пример добавления в такую таблицу: 

        insert into as_pv(traceID, fullurl, username, created, referrer,falconGuid, url)
        select  id, url,   username,  created, referrer, falconGuid,
        substring(url, 1, iif(CHARINDEX('?', url)>1, CHARINDEX('?', url)-1, 1000))
        from as_trace 
        where code='pv' and created > dateadd(month, -1, getdate()) and  id not in (select traceID from  as_pv)

В данном случае в URL мы сохраняем адрес без параметров(все что идет после знака "?"). 

Производная таблица имеет ссылку на оригинальную таблицу (traceID с отношением 1:1) для тогго, чтобы при повторном запросе не записывались дубли. 

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

Насколько полезной была статья?

Что еще посмотреть по SQL Server

SQL. Получение null при конкатенации (объединении) строк

SQL. Проблема с доступом к таблице БД

SQL Server. Ошибка Table:String or binary data would be truncated. The statement has been terminated.

SQL Management Studio медленно работает, тормозит. Как решить проблему

Распространенные ошибки SQL в хранимых процедурах и запросах

Не запускается Configuration Manager

Решение проблем MS SQL Server с блокировками

Решение ошибки Cannot resolve the collation conflict between

SQL. Ошибка. Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Сколько памяти использует SQL Server

Не создается диаграмма в SQL Server. Ошибка при создании диаграмм БД

Проблема Не получается сделать take offline для базы данных

Разработчик SQL, нужны клиенты и заказы?

Прямые заказы от клиентов. Нужно знать только SQL и HTML
Работа на MS SQL Server

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK