8.х Правильно ли с точки зрения оптимальности написан запрос

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 23 мар 2017.

  1. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Код:
    ВЫБРАТЬ
       ЛицевыеСчетаРаботниковОрганизации.ФизЛицо КАК ФизЛицо,
       ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета
    ПОМЕСТИТЬ ЛицевыеСчета
    ИЗ
       РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации
    ГДЕ
       ЛицевыеСчетаРаботниковОрганизации.Банк = &Банк
    
    ИНДЕКСИРОВАТЬ ПО
       ФизЛицо
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
       ЛицевыеСчета.НомерЛицевогоСчета КАК НомерЛС,
       ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо КАК Физлицо,
       ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо.ДатаРождения КАК ДатаРождения,
       ЗарплатаКВыплатеОрганизацийЗарплата.Сумма КАК Сумма,
    ИЗ
       Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
         ЛЕВОЕ СОЕДИНЕНИЕ ЛицевыеСчета КАК ЛицевыеСчета
         ПО ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо = ЛицевыеСчета.ФизЛицо,
    ГДЕ
       ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка В(&Ведомость)
    
    В РС ЛицевыеСчетаРаботниковОрганизации не периодический. Порядок измерений у него: Организация, Банк, Физлицо.
    Для первые 2-х в измерении стоит индексировать, для Физлицо - не индексировать.

    Нужно ли индексировать ВТ ЛицевыеСчета если записей в документе не будет более сотни.
    Если теоретически претположить что результат запроса будет выдавать несколько тысяч запись правильно ли проведена индексация в запросе.

    Какие ошибки допущены?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Выгребать все л/с во временную таблицу смысла мало(а то и вообще нет), т.к. записей может быть очень много.
    Можно просто левым соединением обойтись, тем более, что соединение будет по индексируемым полям.
  3. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    У меня условие накладывается на лицевые счета - Банк, и на документ - ссылка. Не будет ли ошибки если я в таком случае не буду использовать ВТ? Я считал что без ВТ можно обойтись только если условия накладываются на одну таблицу. А у меня на две. Если первое условие вернет истину а второе ложь?
    --- Объединение сообщений, 23 мар 2017 ---
    Соединение будет по физ лицу, в конфигураторе это измерение не индексировано
  4. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Вадим, объясни, пожалуйста, почему. Я вот всегда думал, что раз записей много (>1000), а для соединения тебе требуется неидексируемое поле, то лучше бы все предварительно проиндексировать.
    Но у меня очень малый опыт в оптимизации запросов, расскажи на пальцах плз =)
    ===
    Вообще не понимаю, откуда в этой таблице (ЛицевыеСчетаРаботниковОрганизации) столько записей, что их индексировать? десяток организаций с тысячью работниками по несколько счетов?:)
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Потому что на создание временной таблицы тратятся ресурсы: место в темпдб + время, если еще индексировать, то это еще + место в темпдб и время на создание индексов.

    Временные таблицы актуальны на небольшом количестве записей (имхо, до 500) и обязательно с тем учетом, что временная таблица будет использоваться более 1 раза, либо эта таблица будет выступать основной таблицей в соединении.

    В обсуждаемом примере записей может быть заметно больше и эта таблица будет использоваться ведомой в соединении - план выполнения запроса будет не оптимальным, т.к. для временных таблиц нет статистики.

    Если я правильно помню и не ошибаюсь, то по измерениям регистра индекс строится всегда, включение индексирования для измерения в конфигураторе - включает такое измерение в кластерный индекс.

    Таблица регистра и так имеет индексы по измерениям, соединение с ней будет достаточно быстрым, т.к. будет выполнятся по индексируемому полю, если конечно индексы в порядке.
    Можно еще чутка ускорить соединение, если сделать соединение по всем индексируемым полям.
    Последнее редактирование: 23 мар 2017
  6. bajiepka
    Offline

    bajiepka Профессионал в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    459
    Симпатии:
    31
    Баллы:
    54
    Один из примеров (скорее даже исключение) того, что без ВТ в некоторых случаях оптимальности не обойтись.
    https://its.1c.ru/db/metod8dev/content/4208/hdoc/_top/postgresql
    На практике ускоряет запрос раз в 10
    Последнее редактирование: 24 мар 2017
  7. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    430
    Симпатии:
    12
    Баллы:
    29
    Так будет хуже или лучше?

    Код:
    ВЫБРАТЬ
        ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо КАК Физлицо,
        ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо.ДатаРождения,
        ЗарплатаКВыплатеОрганизацийЗарплата.Сумма
    ПОМЕСТИТЬ СписокФизлиц
    ИЗ
        Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
    ГДЕ
        ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка В(&Ведомость)
    
    ИНДЕКСИРОВАТЬ ПО
        Физлицо
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЛицевыеСчетаРаботниковОрганизации.ФизЛицо КАК ФизЛицо,
        ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета
    ПОМЕСТИТЬ ЛицевыеСчета
    ИЗ
        РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации
    ГДЕ
        ЛицевыеСчетаРаботниковОрганизации.Банк = &Банк
        И ЛицевыеСчетаРаботниковОрганизации.ФизЛицо В
                (ВЫБРАТЬ
                    СписокФизлиц.Физлицо
                ИЗ
                    СписокФизлиц КАК СписокФизлиц)
    
    ИНДЕКСИРОВАТЬ ПО
        ФизЛицо
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        СписокФизлиц.Физлицо,
        СписокФизлиц.ФизлицоДатаРождения КАК ДатаРождения,
        СУММА(СписокФизлиц.Сумма) КАК Сумма,
        ЛицевыеСчета.НомерЛицевогоСчета КАК НомерЛС
    ИЗ
        СписокФизлиц КАК СписокФизлиц
            ЛЕВОЕ СОЕДИНЕНИЕ ЛицевыеСчета КАК ЛицевыеСчета
            ПО СписокФизлиц.Физлицо = ЛицевыеСчета.ФизЛицо
    
  8. bajiepka
    Offline

    bajiepka Профессионал в 1С

    Регистрация:
    26 сен 2014
    Сообщения:
    459
    Симпатии:
    31
    Баллы:
    54
    сделай одним запросом с вложенными, чтобы без ВТ и если твой запрос будет запускаться на постгресе тогда уже будешь разбираться
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.408
    Симпатии:
    973
    Баллы:
    204
    Просто табличную часть документа левым соединением с лицевыми счетами.
    Не нужно мудрить :)

Поделиться этой страницей