Я думаю о двух подходах к улучшению производительности диаграмм:
- Пытается улучшить производительность запросов.
- Сокращение объема данных, необходимых для чтения.
Мне практически невозможно улучшить производительность запросов без полного DDL и планов выполнения.Поэтому я предлагаю вам уменьшить объем данных, которые нужно прочитать.
Ключ сводится к суммированию групп с заданным уровнем детализации по мере поступления данных и хранению их в отдельной таблице, как показано ниже:
CREATE TABLE SummarizedData
(
int GroupId PRIMARY KEY,
FromDate datetime,
ToDate datetime,
SumX float,
SumY float,
GroupCount
)
IdGroup
должен быть равен Id/100
или Id/1000
в зависимости от того, сколько гранулярности вы хотите в группах.С большими группами вы получаете более грубую гранулярность, но более эффективные диаграммы.
Я предполагаю, что столбец LargeTable
Id
монотонно увеличивается, поэтому вы можете сохранить последний Id
, который был обработан в другой таблице с именемSummaryProcessExecutions
Вам потребуется хранимая процедура ExecuteSummaryProcess
, которая:
- Чтение
LastProcessedId
из SummaryProcessExecutions - Чтение Last
Id
на большой таблицеи сохранить его в @NewLastProcessedId
переменную - Суммировать все строки из
LargeTable
с Id > @LastProcessedId and Id <= @NewLastProcessedId
и сохранить результаты в SummarizedData
таблицу - Сохранить
@NewLastProcessedId
переменную в SummaryProcessExecutions
таблицу
Вы можете часто выполнять ExecuteSummaryProcess
хранимую процедуру в задании агента SQL Server.
Я считаю, что группировка по дате была бы лучшим выбором, чем группировка по идентификатору.Это упростит вещи.Столбец SummarizedData
GroupId
не будет связан с LargeTable
Id
, и вам не нужно будет обновлять SummarizedData
строки, вам нужно будет только вставить строки.