Всем привет. Есть две самописанные управленческие, транзакционные базы. Первая весит 670 ГБ. Вторая 880 ГБ. Конфигурации почти одинаковые. Ночью выполняется регламентное задание продолжительностью в первой базе 30 мин, во второй 1.5 часа.
Оптимизировал запрос который больше всех длился. Рег задание выполнялось в первой базе 12 мин, во второй 18 мин. Через день обратно начало выполняться 30 мин и 1.5 часа соответственно. Изменений конфигураций не было. И вот уже неделю так.
Код проверил в рабочей базе на месте. В чем может быть причина? Почему только на день помогла оптимизация?
(1) Замер производительности выполните и тогда можно предметно начать обсуждать проблему. А вообще на проблемы по таким базам нужно DBA привлекать или эксперта по технологическим вопросам.
ВЫБРАТЬ
РасчетыПоОсновномуДолгуОстатки.Заем,
РасчетыПоОсновномуДолгуОстатки.КлассификационнаяКатегорияЗайма,
СУММА(РасчетыПоОсновномуДолгуОстатки.СуммаОстаток) КАК СуммаОстаток,
РасчетыПоОсновномуДолгуОстатки.Подразделение,
РасчетыПоОсновномуДолгуОстатки.Клиент
ПОМЕСТИТЬ ОстаткиПоЗаймам
ИЗ
РегистрНакопления.РасчетыПоОсновномуДолгу.Остатки(&Дата, Организация = &Организация) КАК РасчетыПоОсновномуДолгуОстатки
СГРУППИРОВАТЬ ПО
РасчетыПоОсновномуДолгуОстатки.Заем,
РасчетыПоОсновномуДолгуОстатки.КлассификационнаяКатегорияЗайма,
РасчетыПоОсновномуДолгуОстатки.Подразделение,
РасчетыПоОсновномуДолгуОстатки.Клиент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РасчетныеДатыЗаймовСрезПоследних.Заем,
РасчетныеДатыЗаймовСрезПоследних.ДатаПланируемогоПогашения,
РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияПериодаГарантированногоОжидания,
ОстаткиПоЗаймам.КлассификационнаяКатегорияЗайма,
ОстаткиПоЗаймам.СуммаОстаток,
ВЫБОР
КОГДА РасчетныеДатыЗаймовСрезПоследних.ДатаПланируемогоПогашения < &Дата
И ОстаткиПоЗаймам.КлассификационнаяКатегорияЗайма = ЗНАЧЕНИЕ(Перечисление.КатегорииЗаймов.Стандартные)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КатегорииЗаймов.Просроченные)
КОГДА РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияПериодаГарантированногоОжидания < &Дата
И ОстаткиПоЗаймам.КлассификационнаяКатегорияЗайма = ЗНАЧЕНИЕ(Перечисление.КатегорииЗаймов.Просроченные)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КатегорииЗаймов.Проблемные)
ИНАЧЕ ОстаткиПоЗаймам.КлассификационнаяКатегорияЗайма
КОНЕЦ КАК НоваяКлассификационнаяКатегорияЗайма,
ОстаткиПоЗаймам.Подразделение,
ОстаткиПоЗаймам.Клиент
ПОМЕСТИТЬ ТаблицаЗаймов
ИЗ
РегистрСведений.РасчетныеДатыЗаймов.СрезПоследних(
&Дата,
Заем В
(ВЫБРАТЬ
ОстаткиПоЗаймам.Заем
ИЗ
ОстаткиПоЗаймам КАК ОстаткиПоЗаймам)) КАК РасчетныеДатыЗаймовСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПоЗаймам КАК ОстаткиПоЗаймам
ПО РасчетныеДатыЗаймовСрезПоследних.Заем = ОстаткиПоЗаймам.Заем
ГДЕ
(РасчетныеДатыЗаймовСрезПоследних.ДатаПланируемогоПогашения < &Дата
ИЛИ РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияПериодаГарантированногоОжидания < &Дата)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаЗаймов.Заем,
ТаблицаЗаймов.ДатаПланируемогоПогашения,
ТаблицаЗаймов.ДатаОкончанияПериодаГарантированногоОжидания,
ТаблицаЗаймов.КлассификационнаяКатегорияЗайма,
ТаблицаЗаймов.СуммаОстаток,
ТаблицаЗаймов.НоваяКлассификационнаяКатегорияЗайма,
ТаблицаЗаймов.Подразделение,
ТаблицаЗаймов.Клиент,
ТаблицаЗаймов.Заем.ЗаемПоАкцииОИЛ КАК ЗаемПоАкцииОИЛ
ИЗ
ТаблицаЗаймов КАК ТаблицаЗаймов
ГДЕ
ТаблицаЗаймов.КлассификационнаяКатегорияЗайма <> ТаблицаЗаймов.НоваяКлассификационнаяКатегорияЗайма
Показать
Запрос №2.
ВЫБРАТЬ
РасчетыПоОсновномуДолгуОстатки.Заем,
РасчетыПоОсновномуДолгуОстатки.СуммаОстаток,
ЕСТЬNULL(ПредоплаченноеВознаграждениеОстатки.СуммаВознагражденияОстаток, 0) КАК ОстатокДБП,
РасчетыПоОсновномуДолгуОстатки.Клиент,
РасчетыПоОсновномуДолгуОстатки.Подразделение
ПОМЕСТИТЬ ОстатокКредитногоПортфеля
ИЗ
РегистрНакопления.РасчетыПоОсновномуДолгу.Остатки(
&Дата,
(Организация, КлассификационнаяКатегорияЗайма) В
(ВЫБРАТЬ
&Организация,
&Стандарт)) КАК РасчетыПоОсновномуДолгуОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПредоплаченноеВознаграждение.Остатки КАК ПредоплаченноеВознаграждениеОстатки
ПО РасчетыПоОсновномуДолгуОстатки.Заем = ПредоплаченноеВознаграждениеОстатки.Заем
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстатокКредитногоПортфеля.Заем,
ОстатокКредитногоПортфеля.СуммаОстаток,
РасчетныеДатыЗаймовСрезПоследних.Период,
РасчетныеДатыЗаймовСрезПоследних.ДатаНачалаДБП,
РасчетныеДатыЗаймовСрезПоследних.ДатаНачалаПродления,
РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияПродления,
РасчетныеДатыЗаймовСрезПоследних.ДатаПланируемогоПогашения,
РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияПериодаГарантированногоОжидания,
ОстатокКредитногоПортфеля.Клиент,
ОстатокКредитногоПортфеля.Подразделение,
РасчетныеДатыЗаймовСрезПоследних.ДатаНачисленияДоходов,
РасчетныеДатыЗаймовСрезПоследних.ДатаОкончанияСверхГарантированногоПериодаОжидания
ИЗ
ОстатокКредитногоПортфеля КАК ОстатокКредитногоПортфеля
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РасчетныеДатыЗаймов.СрезПоследних(
&Дата,
Заем В
(ВЫБРАТЬ
ОстатокКредитногоПортфеля.Заем
ИЗ
ОстатокКредитногоПортфеля КАК ОстатокКредитногоПортфеля)) КАК РасчетныеДатыЗаймовСрезПоследних
ПО ОстатокКредитногоПортфеля.Заем = РасчетныеДатыЗаймовСрезПоследних.Заем
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыЗаймов.СрезПоследних КАК СтатусыЗаймовСрезПоследних
ПО ОстатокКредитногоПортфеля.Заем = СтатусыЗаймовСрезПоследних.Заем
ГДЕ
ОстатокКредитногоПортфеля.ОстатокДБП = 0
И ОстатокКредитногоПортфеля.Заем.МетодОплатыВознаграждения = &МетодОплатыВознаграждения
И РасчетныеДатыЗаймовСрезПоследних.ДатаПланируемогоПогашения = ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), СЕКУНДА, -1)
И СтатусыЗаймовСрезПоследних.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаймов.СанкционныйСписок)
(7)
В запросе 1:
В 1 запросе добавить индекс по полю Заем.
во 2 запросе сначала выбрать данные РС во временную таблицу, и добавить индекс по полю заем, и уже в следующем запросе соединить данные из 1 и 2 запроса.
Во втором запросе отбор по МетодОплатыВознаграждения выполняется в самом последнем запросе, хотя это можно отобрать заранее
И ОстатокКредитногоПортфеля.Заем.МетодОплатыВознаграждения = &МетодОплатыВознаграждения
(7) В первом пакете. В первом запросе сгруппировать - лишнее, во втором запросе условие из параметров убрать переделать соединение на внутреннее. Можно ли убрать из параметра запроса Дата? Если у среза есть реальная таблица, то выигрыш будет заметный. Условие или - плохое попробуйте заменить на объединение. Ну и третий запрос от него можно избавится перенести условие во второй. Про индексы уже написали.
По второму пакету уже все замечания высказали я к ним присоединяюсь.
(1) как вариант, убедиться что в это же время не делается бекап базы;
и не работают другие регл задания ...
особенно следует проверить тестовые базы - в которых как правило забывают отключить регл-задания, и все тестовые базы вместе с основной колбасят;
(1) снимайте планы запросов, когда хорошо и когда плохо. Это простое правило часто может ответить на эти вопросы.
В Вашей ситуации может быть от железок до неактуальной статистики и закешенного плохого плана
(3) ну, нам отсюда не видно, что вообще делает рег задание и какие параметры сервера, на котором оно выполняется. Мот там и ресурсов нет вовсе, например, памяти свободной
1) Необходимо посмотреть не выполняется ли никаких файловых операций на диске. Для этого достаточно монитором посмотреть.
2) Свободное место на дисках проверьте, бывают установки квот.
3) Попробуйте, провести реиндексацию базы данных.
Performance Monitor Основным инструментом для управления счетчиками производительности в Windows является оснастка Монитор производительности (Performance Monitor), в более ранних версиях Windows известная как Системный монитор. Performance Monitor имеет несколько режимов отображения и позволяет выводить показания счетчиков производительности в режиме реального времени, а также сохранять данные в лог-файлы для последующего изучения.
снять галочку ППД со всяких левых объектов типа истории версионирования и т.п.
свернуть таблицы где больше 10 млн строк
делать слияние индексов ночью в наименее загруженный период
блокировки живут на сервере 1С преимущественно
но обмены и на скуле генерирует блокировки иногда или сами попадают на них
08:31.365000-0,EXCP,6,process=rphost,p:processName=lotos_01,t:clientID=116,t:applicationName=BackgroundJob,,t:connectID=1707,SessionID=22695,Usr=Экспорт в МИС,dbpid=76,Exception=DataBaseException,Descr='Конфликт блокировок при выполнении транзакции:Microsoft SQL Server Native Client 11.0: Lock request time out period exceeded.HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=38, Severity=10, native=1222, line=1',Context='ОбщийМодуль._ОбменMIS.Модуль : 2337 : ОбработатьОбъектПланаОбмена("ДокументСсылка","Документы","РеализацияТоваровУслуг", Узел); ОбщийМодуль._ОбменMIS.Модуль : 2450 : ОтправитьОбъектПоСЗ(Новый СписокЗначений,Тип+"."+ТипЗ, НастройкиБаз,Новый СписокЗначений); ОбщийМодуль._ОбменMIS.Модуль : 2269 : РеализацияТоваровУслуг(СЗ, НастройкиБаз); ОбщийМодуль._ОбменMIS.Модуль : 233 : ОтправитьВМИС(ТекстЗапроса,СтрПараметров,СтрНовТип,СтрДополнительныеОператоры, НастройкиБаз) ОбщийМодуль._ОбменMIS.Модуль : 1544 : Результат = Запрос.Выполнить();'