|
Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
Railways
07.04.14
✎
22:02
|
Вопрос: можно ли оптимизировать следующий запрос и, если можно, то как
ВЫБРАТЬ ВЫРАЗИТЬ(ТаблицаСсылок.Ссылка КАК Документ.НачислениеОтпускаРаботникамОрганизаций) КАК Ссылка ПОМЕСТИТЬ ВТ_ТаблицаСсылок ИЗ &ТаблицаСсылок КАК ТаблицаСсылок ИНДЕКСИРОВАТЬ ПО Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ НачислениеОтпускаРаботникамОрганизаций.ПерерассчитываемыйДокумент КАК ПерерассчитываемыйДокумент ПОМЕСТИТЬ ВТ_ПерерасчитываемыеДокументы ИЗ Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций ИНДЕКСИРОВАТЬ ПО ПерерассчитываемыйДокумент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ОсновныеНачисленияРаботниковОрганизацийФактическийПериодДействия.ДополнительныеДанные, ОсновныеНачисленияРаботниковОрганизацийФактическийПериодДействия.Регистратор КАК Регистратор, ОсновныеНачисленияРаботниковОрганизацийФактическийПериодДействия.ОплаченоДнейЧасов, ОсновныеНачисленияРаботниковОрганизацийФактическийПериодДействия.ВидРасчета КАК ВидРасчета ПОМЕСТИТЬ ВТ_ОН_ФактическийПериодДействия ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия( Регистратор В (ВЫБРАТЬ ВТ_ТаблицаСсылок.Ссылка ИЗ ВТ_ТаблицаСсылок) И НЕ Сторно) КАК ОсновныеНачисленияРаботниковОрганизацийФактическийПериодДействия ИНДЕКСИРОВАТЬ ПО Регистратор, ВидРасчета ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВТ_ОН_ФактическийПериодДействия.Регистратор, СУММА(ВТ_ОН_ФактическийПериодДействия.ОплаченоДнейЧасов) КАК ОплаченоДнейЧасовОтпуска ПОМЕСТИТЬ ДанныеРР_ДнейОтпускаПоКаледнарнымДням ИЗ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ГДЕ ВТ_ОН_ФактическийПериодДействия.ВидРасчета В (ВЫБРАТЬ ОсновныеНачисленияОрганизаций.Ссылка КАК ОтпускПоКалендарнымДням ИЗ ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций ГДЕ ОсновныеНачисленияОрганизаций.ОбозначениеВТабелеУчетаРабочегоВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск)) СГРУППИРОВАТЬ ПО ВТ_ОН_ФактическийПериодДействия.Регистратор ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВТ_ОН_ФактическийПериодДействия.Регистратор, СУММА(ВТ_ОН_ФактическийПериодДействия.ОплаченоДнейЧасов) КАК ОплаченоДнейЧасовДополнительногоОтпуска ПОМЕСТИТЬ ДанныеРР_ДопДнейОтпускаПоКаледнарнымДням ИЗ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ГДЕ ВТ_ОН_ФактическийПериодДействия.ВидРасчета В (ВЫБРАТЬ ОсновныеНачисленияОрганизаций.Ссылка КАК ОтпускПоКалендарнымДням ИЗ ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций ГДЕ ОсновныеНачисленияОрганизаций.ОбозначениеВТабелеУчетаРабочегоВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ДополнительныйОтпуск)) СГРУППИРОВАТЬ ПО ВТ_ОН_ФактическийПериодДействия.Регистратор ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВТ_ОН_ФактическийПериодДействия.Регистратор, СУММА(ВТ_ОН_ФактическийПериодДействия.ОплаченоДнейЧасов) КАК ОплаченоДнейЧасовПоСреднему ПОМЕСТИТЬ ДанныеРР_ДнейОплатыПоСреднему ИЗ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ГДЕ ВТ_ОН_ФактическийПериодДействия.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднему) СГРУППИРОВАТЬ ПО ВТ_ОН_ФактическийПериодДействия.Регистратор ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ЕСТЬNULL(ТаблицаСсылок.Ссылка, ЗНАЧЕНИЕ(Документ.НачислениеОтпускаРаботникамОрганизаций.ПустаяСсылка))) КАК Ссылка, МАКСИМУМ(ЕСТЬNULL(ВТ_ОН_ФактическийПериодДействия.ДополнительныеДанные, 0)) КАК СреднеДневнойЗаработок, МАКСИМУМ(ЕСТЬNULL(ТаблицаСсылок.Ссылка.ПериодРасчетаСреднегоЗаработкаНачало, 0)) КАК ПериодРасчетаСреднегоЗаработкаНачало, ЕСТЬNULL(ТаблицаСсылок.Ссылка.Сотрудник, 0) КАК Сотрудник, МАКСИМУМ(ЕСТЬNULL(ТаблицаСсылок.Ссылка.Сотрудник.ДатаПриемаНаРаботу, 0)) КАК ДатаПриемаНаРаботу, МАКСИМУМ(ЕСТЬNULL(ТаблицаСсылок.Ссылка.ДляПремийЧастичноУчитываемых_ОтработаноПоПятидневке, 0)) КАК ДляПремийЧастичноУчитываемых_ОтработаноПоПятидневке, МАКСИМУМ(ЕСТЬNULL(ТаблицаСсылок.Ссылка.ДляПремийЧастичноУчитываемых_НормаПоПятидневке, 0)) КАК ДляПремийЧастичноУчитываемых_НормаПоПятидневке, ЕСТЬNULL(ДанныеРР_ДнейОтпускаПоКаледнарнымДням.ОплаченоДнейЧасовОтпуска, 0) КАК ОплаченоДнейЧасовОтпуска, МАКСИМУМ(ЕСТЬNULL(ДанныеРР_ДопДнейОтпускаПоКаледнарнымДням.ОплаченоДнейЧасовДополнительногоОтпуска, 0)) КАК ОплаченоДнейЧасовДополнительногоОтпуска, ЕСТЬNULL(ДанныеРР_ДнейОплатыПоСреднему.ОплаченоДнейЧасовПоСреднему, 0) КАК ОплаченоДнейЧасовПоСреднему, ВЫБОР КОГДА ВТ_ПерерасчитываемыеДокументы.ПерерассчитываемыйДокумент ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК ДокументПерерассчитан ИЗ ВТ_ТаблицаСсылок КАК ТаблицаСсылок ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ПО ТаблицаСсылок.Ссылка = ВТ_ОН_ФактическийПериодДействия.Регистратор ПОЛНОЕ СОЕДИНЕНИЕ ДанныеРР_ДнейОтпускаПоКаледнарнымДням КАК ДанныеРР_ДнейОтпускаПоКаледнарнымДням ПО ТаблицаСсылок.Ссылка = ДанныеРР_ДнейОтпускаПоКаледнарнымДням.Регистратор ПОЛНОЕ СОЕДИНЕНИЕ ДанныеРР_ДопДнейОтпускаПоКаледнарнымДням КАК ДанныеРР_ДопДнейОтпускаПоКаледнарнымДням ПО ТаблицаСсылок.Ссылка = ДанныеРР_ДопДнейОтпускаПоКаледнарнымДням.Регистратор ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРР_ДнейОплатыПоСреднему КАК ДанныеРР_ДнейОплатыПоСреднему ПО ТаблицаСсылок.Ссылка = ДанныеРР_ДнейОплатыПоСреднему.Регистратор ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПерерасчитываемыеДокументы КАК ВТ_ПерерасчитываемыеДокументы ПО ТаблицаСсылок.Ссылка = ВТ_ПерерасчитываемыеДокументы.ПерерассчитываемыйДокумент СГРУППИРОВАТЬ ПО ЕСТЬNULL(ДанныеРР_ДнейОтпускаПоКаледнарнымДням.ОплаченоДнейЧасовОтпуска, 0), ЕСТЬNULL(ТаблицаСсылок.Ссылка.Сотрудник, 0), ЕСТЬNULL(ДанныеРР_ДнейОплатыПоСреднему.ОплаченоДнейЧасовПоСреднему, 0), ВЫБОР КОГДА ВТ_ПерерасчитываемыеДокументы.ПерерассчитываемыйДокумент ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ УПОРЯДОЧИТЬ ПО ПериодРасчетаСреднегоЗаработкаНачало |
|||
1
Aloex
07.04.14
✎
22:07
|
Зачем?
|
|||
2
vi0
07.04.14
✎
22:12
|
(0) странно, что во втором запросе нет условия
|
|||
3
Railways
07.04.14
✎
22:22
|
во втором пекете не может быть условий исходя из логики задания - определить исправлялся ли документ или нет.
|
|||
4
Railways
07.04.14
✎
22:23
|
хотя...если предположить, что документ-исправление всегда проводится позднее, то можно наложить условия
|
|||
5
Railways
07.04.14
✎
22:24
|
(1) медленно отрабатывает
|
|||
6
vi0
07.04.14
✎
22:25
|
(3) не очень понял как можно выбирать все документы без условия? тем более во временную таблицу
присоединяй сразу документ в последнем запросе без ВР, вот тебе и оптимизация |
|||
7
Railways
07.04.14
✎
22:27
|
(6) ТОЧНО !!!! может еще чего посоветуешь?
|
|||
8
Railways
07.04.14
✎
22:30
|
в типовой ЗУП напрашивается РС "Исправленные документы". Не?
|
|||
9
Railways
07.04.14
✎
22:33
|
(6) чуть быстрее, но все равно нужно дальше оптимизировать
|
|||
10
vi0
07.04.14
✎
22:37
|
можно _рассмотреть_ добавление индекса на
Документ.НачислениеОтпускаРаботникамОрганизаций.ПерерассчитываемыйДокумент но я бы предварительно все а профайлере проанализировал |
|||
11
Railways
07.04.14
✎
22:41
|
(10) в типовой ЗУП он проиндексирован из коробки.
Профайлер - это хорошо... |
|||
12
vi0
07.04.14
✎
22:46
|
Подозреваю, что "НЕ Сторно" может мешать испольщзованию индекса по регистратору (если он там есть)
Можно попробовать вынести "Не сторно" за параметры виртуальной таблицы опять же условия к подзапросам всегда не были рекомендованы для производительности |
|||
13
Railways
07.04.14
✎
22:56
|
(12) про "НЕ СТОРНО" понятно.
что имеется ввиду под "условия к подзапросам"? ВМЕСТО ЭТОГО: ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ВТ_ОН_ФактическийПериодДействия.Регистратор, СУММА(ВТ_ОН_ФактическийПериодДействия.ОплаченоДнейЧасов) КАК ОплаченоДнейЧасовОтпуска ПОМЕСТИТЬ ДанныеРР_ДнейОтпускаПоКаледнарнымДням ИЗ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ГДЕ ВТ_ОН_ФактическийПериодДействия.ВидРасчета В (ВЫБРАТЬ ОсновныеНачисленияОрганизаций.Ссылка КАК ОтпускПоКалендарнымДням ИЗ ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций ГДЕ ОсновныеНачисленияОрганизаций.ОбозначениеВТабелеУчетаРабочегоВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск)) СГРУППИРОВАТЬ ПО ВТ_ОН_ФактическийПериодДействия.Регистратор ПИСАТЬ ТАК: ВЫБРАТЬ РАЗРЕШЕННЫЕ ВТ_ОН_ФактическийПериодДействия.Регистратор, СУММА(ВТ_ОН_ФактическийПериодДействия.ОплаченоДнейЧасов) КАК ОплаченоДнейЧасовОтпуска ПОМЕСТИТЬ ДанныеРР_ДнейОтпускаПоКаледнарнымДням ИЗ ВТ_ОН_ФактическийПериодДействия КАК ВТ_ОН_ФактическийПериодДействия ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.ОсновныеНачисленияОрганизаций КАК ОсновныеНачисленияОрганизаций ПО (ВТ_ОН_ФактическийПериодДействия.ВидРасчета = ОсновныеНачисленияОрганизаций.Ссылка И ОсновныеНачисленияОрганизаций.ОбозначениеВТабелеУчетаРабочегоВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск)) СГРУППИРОВАТЬ ПО ВТ_ОН_ФактическийПериодДействия.Регистратор ? |
|||
14
Railways
07.04.14
✎
23:19
|
По всякому уже попробовал. Все комбинации. Результат как и раньше (1.5 сек).
|
|||
15
vi0
07.04.14
✎
23:23
|
(13) эти вариации тоже могут по разному отрабатываться, но как говориться depends on
но я имел ввиду предварительно сохранить ПланВидовРасчета во временную таблицу и к нему делать В |
|||
16
Railways
08.04.14
✎
11:43
|
(15) ВПР на самом деле состояит из ~50 записей и тормозить не может. В другую сторону надо посмотреть...
|
|||
17
vi0
08.04.14
✎
12:00
|
(16) другая сторона называется профайлером)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |