|
Регистр расчета | ☑ | ||
---|---|---|---|---|
0
saksaul
20.08.15
✎
12:40
|
Переписанная конфигурация УПП 1.2.3.1 в режиме совместимости на платформе 8.2.13.219
Клиент-сервер. ОС сервера: Win2008 SQL 8R2 размер базы 250 ГБ железо как мне сказали топовое, оперативы более 200 ГБ Документ РасчсетСтраховыхВзносов внезапно стал заполняться очень долго - расчетно двое суток, но никто до конца так и не дождался (ждали более суток). При рассмотрении причины была выявлена часть запроса отвечающего за заполнение которая тормозит процесс: [spoiler=Первоначальный запрос] ВЫБРАТЬ БазаСреднегоЗаработка.Регистратор, БазаСреднегоЗаработка.НомерСтроки, БазаСреднегоЗаработка.КодДоходаЕСНРазрез, БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез, БазаСреднегоЗаработка.РезультатБаза ИЗ (ВЫБРАТЬ ОсновныеНачисления.Регистратор КАК Регистратор, ОсновныеНачисления.НомерСтроки КАК НомерСтроки, БазаСреднегоЗаработка.КодДоходаЕСНРазрез КАК КодДоходаЕСНРазрез, БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез КАК ОблагаетсяЕНВДРазрез, СУММА(ВЫБОР КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ОсновнойЗаработок) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации КОГДА БазаСреднегоЗаработка.ЧислоМесяцев = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоФиксПремиям) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации * ВЫБОР КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0 ТОГДА 0 ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке КОНЕЦ КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоПремиям) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ФиксГодовыеПремии) ТОГДА БазаСреднегоЗаработка.РезультатБаза * ВЫБОР КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0 ТОГДА 0 ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке КОНЕЦ ИНАЧЕ БазаСреднегоЗаработка.РезультатБаза КОНЕЦ * ВЫБОР КОГДА БазаСреднегоЗаработка.ЧислоМесяцев > БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка ТОГДА БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка / БазаСреднегоЗаработка.ЧислоМесяцев ИНАЧЕ 1 КОНЕЦ КОНЕЦ) КАК РезультатБаза ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНОсновныеНачисления( &парамИзмерения, &парамИзмерения, &парамРазрезыЕСН, Организация = &парамГоловнаяОрганизация И (ПериодРегистрации МЕЖДУ &парамПериодРегистрацииНачало И &парамПериодРегистрации)) КАК БазаСреднегоЗаработка ПО (БазаСреднегоЗаработка.ФизЛицо = ОсновныеНачисления.ФизЛицо) И (БазаСреднегоЗаработка.Организация = ОсновныеНачисления.Организация) И (ВЫБОР КОГДА БазаСреднегоЗаработка.Приказ = &ПустойПриказ ТОГДА БазаСреднегоЗаработка.Приказ КОГДА БазаСреднегоЗаработка.СпособРасчета = &СпособРасчетаПоСреднемуЗаработкуФСС ТОГДА ЕСТЬNULL(БазаСреднегоЗаработка.Регистратор.Приказ, БазаСреднегоЗаработка.Приказ) ИНАЧЕ БазаСреднегоЗаработка.Приказ КОНЕЦ = ОсновныеНачисления.Приказ) И ОсновныеНачисления.ВидРасчета.СпособРасчета = БазаСреднегоЗаработка.СпособРасчета И ОсновныеНачисления.ДатаНачалаСобытия = БазаСреднегоЗаработка.ДатаНачалаСобытия И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаНачало = БазаСреднегоЗаработка.ДатаНачалаРасчетногоПериода И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаОкончание = БазаСреднегоЗаработка.ДатаОкончанияРасчетногоПериода ГДЕ ОсновныеНачисления.ОбособленноеПодразделение = &парамОрганизация И ОсновныеНачисления.ПериодРегистрации = &парамПериодРегистрации И ОсновныеНачисления.ВидРасчета.СпособРасчета В(&парамМассивСпособРасчетаПоСреднему) СГРУППИРОВАТЬ ПО ОсновныеНачисления.Регистратор, ОсновныеНачисления.НомерСтроки, БазаСреднегоЗаработка.КодДоходаЕСНРазрез, БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОсновныеНачисления.Регистратор, ОсновныеНачисления.НомерСтроки, БазаСреднегоЗаработка.КодДоходаЕСНРазрез, БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез, СУММА(ВЫБОР КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ОсновнойЗаработок) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации КОГДА БазаСреднегоЗаработка.ЧислоМесяцев = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоФиксПремиям) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации * ВЫБОР КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0 ТОГДА 0 ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке КОНЕЦ КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ПоПремиям) ТОГДА БазаСреднегоЗаработка.РезультатБаза * БазаСреднегоЗаработка.КоэффициентИндексации КОГДА БазаСреднегоЗаработка.ВидРасчета В (&ФиксГодовыеПремии) ТОГДА БазаСреднегоЗаработка.РезультатБаза * ВЫБОР КОГДА БазаСреднегоЗаработка.НормаПоПятидневке = 0 ТОГДА 0 ИНАЧЕ БазаСреднегоЗаработка.ОтработаноПоПятидневке / БазаСреднегоЗаработка.НормаПоПятидневке КОНЕЦ ИНАЧЕ БазаСреднегоЗаработка.РезультатБаза КОНЕЦ * ВЫБОР КОГДА БазаСреднегоЗаработка.ЧислоМесяцев > БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка ТОГДА БазаСреднегоЗаработка.ПериодРасчетаСреднегоЗаработка / БазаСреднегоЗаработка.ЧислоМесяцев ИНАЧЕ 1 КОНЕЦ КОНЕЦ) ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНДополнительныеНачисления( &парамИзмерения, &парамИзмерения, &парамРазрезыЕСН, Организация = &парамГоловнаяОрганизация И (ПериодРегистрации МЕЖДУ &парамПериодРегистрацииНачало И &парамПериодРегистрации)) КАК БазаСреднегоЗаработка ПО (БазаСреднегоЗаработка.ФизЛицо = ОсновныеНачисления.ФизЛицо) И (БазаСреднегоЗаработка.Организация = ОсновныеНачисления.Организация) И (ВЫБОР КОГДА БазаСреднегоЗаработка.Приказ = &ПустойПриказ ТОГДА БазаСреднегоЗаработка.Приказ КОГДА БазаСреднегоЗаработка.СпособРасчета = &СпособРасчетаПоСреднемуЗаработкуФСС ТОГДА ЕСТЬNULL(БазаСреднегоЗаработка.Регистратор.Приказ, БазаСреднегоЗаработка.Приказ) ИНАЧЕ БазаСреднегоЗаработка.Приказ КОНЕЦ = ОсновныеНачисления.Приказ) И (БазаСреднегоЗаработка.СпособРасчета = ОсновныеНачисления.ВидРасчета.СпособРасчета) И ОсновныеНачисления.ДатаНачалаСобытия = БазаСреднегоЗаработка.ДатаНачалаСобытия И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаНачало = БазаСреднегоЗаработка.ДатаНачалаРасчетногоПериода И ОсновныеНачисления.ПериодРасчетаСреднегоЗаработкаОкончание = БазаСреднегоЗаработка.ДатаОкончанияРасчетногоПериода ГДЕ ОсновныеНачисления.ОбособленноеПодразделение = &парамОрганизация И ОсновныеНачисления.ПериодРегистрации = &парамПериодРегистрации И ОсновныеНачисления.ВидРасчета.СпособРасчета В(&парамМассивСпособРасчетаПоСреднему) СГРУППИРОВАТЬ ПО ОсновныеНачисления.Регистратор, ОсновныеНачисления.НомерСтроки, БазаСреднегоЗаработка.КодДоходаЕСНРазрез, БазаСреднегоЗаработка.ОблагаетсяЕНВДРазрез) КАК БазаСреднегоЗаработка [/spoiler] За периоды с января - май данные выбираются в течении одной минуты (секунд 30), с июня - июль заполняются ооооочень долго. Проблема в первой части запроса - выборка из РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНОсновныеНачисления Переписали "проблемную" часть запроса вот так: [spoiler=Измененная часть] ВЫБРАТЬ РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ПериодРегистрации, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.Регистратор, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ФизЛицо КАК ФизЛицо, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.Организация КАК Организация, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.СпособРасчета КАК СпособРасчета, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ДатаНачалаСобытия, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ДатаНачалаРасчетногоПериода, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ДатаОкончанияРасчетногоПериода, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.Приказ КАК Приказ, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.КодДоходаЕСНРазрез, РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления.ОблагаетсяЕНВДРазрез ПОМЕСТИТЬ ВТ_БазаЕСНОсн ИЗ РегистрРасчета.РасчетСреднегоЗаработка.БазаЕСНОсновныеНачисления( &парамИзмерения, &парамИзмерения, &парамРазрезыЕСН, Организация = &парамГоловнаяОрганизация И (ПериодРегистрации МЕЖДУ &парамПериодРегистрацииНачало И &парамПериодРегистрации)) КАК РасчетСреднегоЗаработкаБазаЕСНОсновныеНачисления ИНДЕКСИРОВАТЬ ПО ФизЛицо, Организация, Приказ, СпособРасчета ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОсновныеНачисленияРаботниковОрганизаций.Регистратор, ОсновныеНачисленияРаботниковОрганизаций.НомерСтроки, ВТ_БазаЕСНОсн.КодДоходаЕСНРазрез, ВТ_БазаЕСНОсн.ОблагаетсяЕНВДРазрез ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисленияРаботниковОрганизаций ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_БазаЕСНОсн КАК ВТ_БазаЕСНОсн ПО ОсновныеНачисленияРаботниковОрганизаций.ФизЛицо = ВТ_БазаЕСНОсн.ФизЛицо И ОсновныеНачисленияРаботниковОрганизаций.Организация = ВТ_БазаЕСНОсн.Организация И ОсновныеНачисленияРаботниковОрганизаций.ВидРасчета.СпособРасчета = ВТ_БазаЕСНОсн.СпособРасчета И ОсновныеНачисленияРаботниковОрганизаций.ДатаНачалаСобытия = ВТ_БазаЕСНОсн.ДатаНачалаСобытия И ОсновныеНачисленияРаботниковОрганизаций.ПериодРасчетаСреднегоЗаработкаНачало = ВТ_БазаЕСНОсн.ДатаНачалаРасчетногоПериода И ОсновныеНачисленияРаботниковОрганизаций.ПериодРасчетаСреднегоЗаработкаОкончание = ВТ_БазаЕСНОсн.ДатаОкончанияРасчетногоПериода И (ВЫБОР КОГДА ВТ_БазаЕСНОсн.Приказ = &ПустойПриказ ТОГДА ВТ_БазаЕСНОсн.Приказ КОГДА ВТ_БазаЕСНОсн.СпособРасчета = &СпособРасчетаПоСреднемуЗаработкуФСС ТОГДА ЕСТЬNULL(ВТ_БазаЕСНОсн.Регистратор.Приказ, ВТ_БазаЕСНОсн.Приказ) ИНАЧЕ ВТ_БазаЕСНОсн.Приказ КОНЕЦ = ОсновныеНачисленияРаботниковОрганизаций.Приказ) [/spoiler] Запрос стал выполнятся всего 40 минут. Что же такое могло произойти с регистром в периоде с июня месяца? С регистрами расчета дела не имел, поэтому пока не очень понимаю куда копать... |
|||
1
saksaul
20.08.15
✎
12:43
|
прошу прощения за оформление, но никаких кнопок редактирования поста не вижу в браузере, вполне возможно дело в ограничениях наложенных СБ предприятия.
|
|||
2
Господин ПЖ
20.08.15
✎
12:45
|
телепатов нет - смотрите сами чего в базе не так
|
|||
3
saksaul
20.08.15
✎
12:48
|
Да я и не надеюсь что мне расскажу что конкретно произошло, мне интересно были ли подобные случаи у кого-то еще и какие проблемы чаще всего встречаются в регистрами расчетов. Может быть сразу на что-то внимание обратить надо.
|
|||
4
leonidkorolev
20.08.15
✎
12:49
|
(0) Глубже надо копать. В скуль лезть. Посмотреть какие таблицы отвечают за этот регистр, какие запросы генерит платформа, смотреть планы запросов.
|
|||
5
GROOVY
20.08.15
✎
12:50
|
Хоть бы отбор по документу сделали...
Да и ПериодРегистрации МЕЖДУ быть не может. Это точка. И вообще ужасный запрос. |
|||
6
saksaul
20.08.15
✎
13:00
|
(5) Почему период ПериодРегистрации МЕЖДУ быть не может?
отбор по документу зачем если данные в общем-то за половину года при вычислении выбираются и рубятся только начиная с 6-го месяца. |
|||
7
GROOVY
20.08.15
✎
13:05
|
(6) А почему нужно данные выбирать из реальной таблицы? Вы все документы каждый месяц пересчитываете? Или все же расчет производится одного документа?
|
|||
8
saksaul
20.08.15
✎
13:06
|
(7) Одного документ только.
|
|||
9
GROOVY
20.08.15
✎
13:42
|
(8) А нафига тогда все выбираете?
И обращение через точку к полям составного типа (ВТ_БазаЕСНОсн.Регистратор.Приказ) - это жесть, типизируйте поле. |
|||
10
saksaul
20.08.15
✎
13:55
|
(9) Этим вопросом уже задались, надо изучать работу документа.
Типизацией уже тоже занялись. Это был просто проверочный вариант максимально близкий к "оригинальному" запросу. |
|||
11
saksaul
20.08.15
✎
14:30
|
(9) что интересно выборка на период по которому делает расчет документ вообще пустая - нет ни одной строки.. типа
|
|||
12
saksaul
01.09.15
✎
09:26
|
Проблема оказалась в документе начисления который был помечен на удаление но при этом его движения остались в регистре.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |