Добрый день, нам ежемесячно надо формировать и отправлять месячные отчёты для сдачи объектов. Мы столкнулись с тем что система не может обработать такое количество данных и выкидывает Учётные записи клиентов и перестает работать служба Сервер ЛЭРС. Для оптимизации запросов мы предлагаем Вам решение данной проблемы:
Запрос
SELECT [t0].[Id], [t0].[EndDate], [t0].[CommLinkType], [t0].[EquipmentId], [t0].[PollErrorCount], [t0].[PollResult], [t0].[PollType]
FROM [Equipment] AS [e]
INNER JOIN (
SELECT [t].[Id], [t].[CommLinkType], [t].[EndDate], [t].[EquipmentId], [t].[PollErrorCount], [t].[PollResult], [t].[PollType]
FROM (
SELECT [e0].[Id], [e0].[CommLinkType], [e0].[EndDate], [e0].[EquipmentId], [e0].[PollErrorCount], [e0].[PollResult], [e0].[PollType], ROW_NUMBER() OVER(PARTITION BY [e0].[EquipmentId] ORDER BY [e0].[EndDate] DESC) AS [row]
FROM [EquipmentPollStatistics] AS [e0]
) AS [t]
WHERE [t].[row] <= 1
) AS [t0] ON [e].[Id] = [t0].[EquipmentId]
берет все записи [EquipmentPollStatistics], нумерует и сортирует по [EquipmentId],[EndDate] чтобы получить последние даты статистики по [Equipment].
Этот запрос выполняется от 1 до 3 секунд и вызывается почти 9500 раз за сбор отчетности. И всего обрабатывает ~1,500,000 строк
Можно использовать
;with eps as (select EquipmentId,max(EndDate) EndDate FROM EquipmentPollStatistics AS eps group by eps.EquipmentId)
SELECT [t].[Id], [t].[CommLinkType], [t].[EndDate], [t].[EquipmentId], [t].[PollErrorCount], [t].[PollResult], [t].[PollType]
FROM eps
JOIN[EquipmentPollStatistics] AS [t] on [t].[EquipmentId]=eps.EquipmentId and [t].[EndDate]=eps.EndDate
JOIN [Equipment] AS [e] ON [e].[Id] = [t].[EquipmentId]
, который меньше секунды. А еще добавить Дату и индекс для даты в [EquipmentPollStatistics]
declare @dt date=dateadd(month,-6,getdate())
;with eps as (select EquipmentId,max(EndDate) EndDate FROM EquipmentPollStatistics AS eps where @dt<=EndDate group by eps.EquipmentId)
SELECT [t].[Id], [t].[CommLinkType], [t].[EndDate], [t].[EquipmentId], [t].[PollErrorCount], [t].[PollResult], [t].[PollType]
FROM eps
join [EquipmentPollStatistics] AS [t] on [t].[EquipmentId]=eps.EquipmentId and [t].[EndDate]=eps.EndDate
JOIN [Equipment] AS [e] ON [e].[Id] = [t].[EquipmentId]
Данное решение Нам предоставил наш Программист который непосредственно занимается разработками на Базе SQL.