Добрый день, уважаемые форумчане помогите разобраться с проблемой.
Может где-то туплю или не знаю, заранее извиняюсь может быть за глупые вопросы.
Краткая предыстория:
У меня есть таблица "Остатки клиентов", назовём её OPERClient, в ней есть поля
Каждый день в данную таблицу подгружаются данные из файла mdb
Мне нужно в одном из отчетов подсчитать за определенный промежуток времени средний остаток, чтобы найти среднее нужно сложить за каждый день остаток и разделить на количество дней в периоде.
есть такой запрос, считающий остаток за каждый день.
Calendar - календарь с датами, почему первичная дата 20130101 - потому что история всех оборотов/остатков по счету ведется с той даты, а так как счет может "спать", соответственно оборот по счету "стоит на месте". Таким образом если мне нужны остатки по счетам с 01.03.2017 по 10.03.2017, то результатом запроса будут, остатки за каждый день из периода.
Уже при накоплении больших объемов инфы, запрос стал выполняться достаточно долго.
Вопрос 1. Как можно данный запрос оптимизировать?
Вопрос 2. Заметил еще такой момент. В какое то время базу данных перенес на более свежий сервер, но на нем проявились тупняки в расчете, на старом сервере выполняется гораздо быстрее. Конфигурация обоих серверов:
"Старый"
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64)
Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Проц- Intel Xeon CPU 3.4 (Cores - 2, Logical Processor - 4)
ОП - 4Gb
"Новый"
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64)
Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Проц - Intel Xeon CPU 3.4 (Cores - 4, Logical Processor - 8)
ОП - 6 GB
На "новом" запрос выполняется более часа, затем беру делаю бэкап базы, восстанавливаю на "Старом", запускаю запрос- выполняется за 20 минут.
Куда копать? Что исправить? Что можно оптимизировать?
Может где-то туплю или не знаю, заранее извиняюсь может быть за глупые вопросы.
Краткая предыстория:
У меня есть таблица "Остатки клиентов", назовём её OPERClient, в ней есть поля
Id - идентификатор записи acc - счет клиента dat - дата транзакции summ - остаток
Каждый день в данную таблицу подгружаются данные из файла mdb
Мне нужно в одном из отчетов подсчитать за определенный промежуток времени средний остаток, чтобы найти среднее нужно сложить за каждый день остаток и разделить на количество дней в периоде.
есть такой запрос, считающий остаток за каждый день.
select r.ACC,c.dt,a.RESTRUB from ( select a.ACC,a.max(dat) maxd,a.min(dat) mind from OPERClient a group by a.ACC) r join CALENDAR c on c.dt between '20130101' and '20170310' cross apply (select MAX(dat) dt from OPERClient where ACC=r.ACC and dat<=c.dt ) dt join OPERClient a on a.dat=dt.dt and a.ACC=r.ACC
Calendar - календарь с датами, почему первичная дата 20130101 - потому что история всех оборотов/остатков по счету ведется с той даты, а так как счет может "спать", соответственно оборот по счету "стоит на месте". Таким образом если мне нужны остатки по счетам с 01.03.2017 по 10.03.2017, то результатом запроса будут, остатки за каждый день из периода.
Уже при накоплении больших объемов инфы, запрос стал выполняться достаточно долго.
Вопрос 1. Как можно данный запрос оптимизировать?
Вопрос 2. Заметил еще такой момент. В какое то время базу данных перенес на более свежий сервер, но на нем проявились тупняки в расчете, на старом сервере выполняется гораздо быстрее. Конфигурация обоих серверов:
"Старый"
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64)
Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Проц- Intel Xeon CPU 3.4 (Cores - 2, Logical Processor - 4)
ОП - 4Gb
"Новый"
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64)
Feb 8 2013 10:37:00 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Проц - Intel Xeon CPU 3.4 (Cores - 4, Logical Processor - 8)
ОП - 6 GB
На "новом" запрос выполняется более часа, затем беру делаю бэкап базы, восстанавливаю на "Старом", запускаю запрос- выполняется за 20 минут.
Куда копать? Что исправить? Что можно оптимизировать?