Построение отчета на основе данных большой таблицы, которая часто изменяется
Вводная в проблему
Допустим есть у нас большая таблица, которая хранит различные логовые данные. Таблица может быть очень большой.
При построении отчетов по ней будут запросы будут медленно обрататывать.
Возможное решение - поставить индексы. Но это может негативно сказаться на быстродействии операций 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 Management Studio медленно работает, тормозит. Как решить проблему
Распространенные ошибки SQL в хранимых процедурах и запросах
Не запускается Configuration Manager
Решение проблем MS SQL Server с блокировками
Решение ошибки Cannot resolve the collation conflict between
Сколько памяти использует SQL Server
Не создается диаграмма в SQL Server. Ошибка при создании диаграмм БД
Разработчик SQL, нужны клиенты и заказы?
Выгода от использования Falcon Space
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта