Имя: Пароль:
1C
1С v8
Оптимизация запроса
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) другая сторона называется профайлером)