Курс по Оптимизации 1С — Занятие №7

В рамках этого занятия необходимо изучить следующие материалы.

Модуль 3. Причины медленной работы

    Глава 8. Анализ причин медленной работы и оптимизация системы

    • Подзапрос в условии соединения
    • Работа с полями состовного типа в запросах
    • Параметры виртуальной таблицы. Запросы в цикле
    • Особенности работы с виртуальными таблицами
    • Рекомендации по написанию запросов

Практическое задание

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (221):

  1. Kamas

    Как я понимаю в pdf «Решение практического задания» показано эталонное решение. Если да то я не понимаю ответ на задание 8.4 ведь у нас по факту получается куча таблиц которые в запросе не участвуют, а в качестве оптимизации предлагается перенести остатки во временную таблицу. Можно пояснить почему? Зарание спасибо.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Виталий

        Можно пояснить выражение «нужно было выбирать требуемые поля сразу в момент создания таблицы», если всего одна таблица в запросе?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  2. Иван Татарников

    Здравствуйте.

    В таблице итогов регистра накопления с включенным режимом разделения итогов хранятся пары одинаковых строк по измерениям, но разными значениями ресурсов и разделителя (Splitter). Та строка, у которой разделитель равен нулю, содержит ненулевой ресурс, а у которой разделитель равен единице — нулевой.
    Например, так:
    Номенклатура Склад Количество Разделитель
    Товар1 Склад1 10 0
    Товар1 Склад1 0 1
    Почему так происходит?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Иван Татарников

        После пересчета итогов запустил скрипт, который Вы в курсе приводите для подсчета нулевых строк, и получается, что нулевых записей в 2 раза меньше общего числа записей для каждого периода.

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

          • Иван Татарников

            Почему после пересчета итогов в регистре общее число записей ровно в 2 раза больше нулевых?

            %D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80.png

            • Андрей Бурмистров


              (текст комментария доступен только участникам Мастер-группы)

  3. Hauliod

    Андрей, доброго времени суток.

    Бегло пробежался по комментариям и похожий вопрос увидел только от слушателя курса с ником «imagic». Вопрос касается к обращению к реквизиту составного типа через точку. В лекциях рекомендуется в таком случае для оптимизации пожертвовать размером хранимых данных в пользу производительности. Однако, в достаточно известной статье от Рупасова Константина есть пункт, в котором приводится пример использования оператора «Выбор … Когда… Тогда… Конец» совместно с оператором «Выразить(… КАК…)» — см. ниже. В лекциях же использование оператора «Выбор…» и полей составного типа наглядно демонстрируется не в его (оператора) пользу. Напишите, пожалуйста, по возможности, поподробнее, возможно ли корректное использование нескольких (а не одного, как в примере в уроке «3.8-2.50 Получение данных через точку. Решение») типов документов в одном поле запроса из реквизита составного типа («imagic» предложил использовать объединение нескольких запросов с использованием в них оператора «Выразить»).

    Пример из статьи Константина Рупасова:
    «…
    | ВЫБОР
    | КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
    | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер
    | КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
    | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер…»

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Hauliod

        То есть, в таком случае СУБД создаст левое соединение только с несколькими таблицами, которые участвуют в выражениях оператора «Выразить», а не со всеми 20, которые входят в состав, правильно?

        Ещё небольшой вопрос: есть оборотный регистр накопления — самое первое измерение (самое верхнее) составного типа. Пишем запрос в котором на данное измерение накладываем условие, плюс, условия на начало и конец периода (естественно, всё в параметрах виртуальной таблицы) — при анализе обнаруживаем, что по идее, должен отработать полностью оператор IndexSeek, НО «Profiler» упорно пихает данное измерение в предикаты, то есть получаем Seek…Where…; Поясните, пожалуйста, почему получается именно так?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

          • Hauliod

            Нет… :( Всё равно используется «Seek…Where…»; Получается, дело не в составном типе измерения… Текст запроса, который для теста использовал и его же текстовый план во вложении.

            • Андрей Бурмистров


              (текст комментария доступен только участникам Мастер-группы)

              • Hauliod

                Хорошо, как только «окно» появится, постараюсь «обрезать» данные и выложить выгрузку.

  4. skeptik_m

    Вопрос, связанный с заданием 7. В курсе говорилось, что соединение с виртуальной таблицей само по себе является потенциальным источником проблем, также как и сподзапросом (т.к. «внутри» виртуальная таблица — это подзапрос и есть). Тем не менее в «эталонном решении» подзапрос в отдельную временную таблицу вынесли,
    а виртуальную таблицу не стали. Т.е. решили, что вместо соединения подзапроса с виртуальной таблицей достаточно сделать соединение временой таблиц с виртуальной. Почему не стали доводить до логического конца — создавать на основе виртальной таблицы врременную и делать соединение двух временных таблиц?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • skeptik_m

        Да, действительно, проявил невнимательность. Приношу извинения.

  5. Сержантов Владимир Викторович

    При просмотре уроков, посвященных причинам медленной работе запросов возник вопрос: а в файловой базе такие же проблемы? Например, обращение к полю через несколько точек, «тонкие» места при работе с полем составного типа и т.д. Это для общего понимания.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • AveryanovAlexey

        А что значит больших объемов и высокой нагрузки?
        С высокой нагрузкой вроде понятно — ожидания на блокировках пошли, значит «война» за ресурсы, файловую базу переросли. А вот касаемо больших объемов? У меня примеры есть, когда 10 человек работаю в базе (не очень активно и конкуренции нет), но базы уже больше 10-15 ГБ. Естественно работают в терминале. Такой размер считается нежелательно большим для файлового режима?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  6. mmch

    Возникла неожиданная проблема при включении Итогов на срез последних у регистров сведений в 8.3

    Типовой построитель отчетов перестает правильно работать, если данные в регистр сведений вносятся задним числом он их не ловит. Видимо нужен пересчет итогов…
    СКД при это работает корректно…

    Возник вопрос, как программно пересчитать итоги по регистру сведений?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  7. t.gimadeev

    Возник вопрос по практическому заданию №7.

    Текст запроса увидел, но нет конфигурации и БД на тестирование запроса и просмотра плана запроса.

    Ну просто как минимум видно основные проблемы запроса, но например непонятно используются ли индексы к полям отбора и т.д.

    Как получается сдавать решение по заданию если его нельзя даже отконфигурировать?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • t.gimadeev

        Просто интересно было б посмотреть на выполнения планов запроса с использованием соединений как было приведено в курсе. Тоесть соединения виртальной таблицы с физической. Как оптемальней толи загонять это во временную ну и т.д.

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  8. imagik

    Андрей, спасибо за ответы на мои многочисленные вопросы))
    Вопрос по индексам во временных таблицах.
    1. Как они будут работать?
    2. Что будет, если, например, реальная таблица проиндексирована по одному полю, а временную таблицу индексируем по другому?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  9. magefred

    Определяемые типы в 8.3, имеют такие же ограничения в запросах как и составные типы?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  10. imagik

    Вопрос (уточнение) про подсчет количества нулевых строк в таблице итогов. Если у меня участвуют не один, а несколько ресурсов, например, количество, сумма, сумма НУ, то тогда условие надо ставить одновременно по всем ресурсам?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  11. imagik

    Вопрос про Объединить и Объединить Все. А как потом без вреда для производительности сгруппировать данные?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  12. imagik

    Конструкция Выбор Когда с полями НЕ составного типа тоже лучше не использовать?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  13. imagik

    Вопрос по обращение через точку к полям составного типа. Можно ли считать решением объединение?
    Т.е.
    Выразить(…).поле
    Объединить все
    Выразить(…).поле
    Объединить все
    Выразить(…).поле ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  14. mmch

    Андрей, добрый день.
    А есть какие нибудь рекомендации по работе с планом видов характеристик?
    Например в УТ 11, на ПВХ реализован механизм дополнительных реквизитов, да и в остальных типовых он используется сплошь и рядом. И получается заведомо не оптимальная система…

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  15. Spakus

    Здравствуйте, Андрей.
    Вы часто говорите о том, что оптимизатор подбирает оптимальный план за определенное ограниченное время. Можно ли каким-либо образом изменить это время(увеличить/уменьшить время для поиска оптимального плана запроса)? Если да, то каким образом?
    Сколько времени дается оптимизатору на построение плана запроса?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  16. Шерстянников Вячеслав

    Добрый день. Вопрос такой: указанный тест запроса не на тестовой базе собран? Какую базу пользовать для оптимизации?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  17. zels

    Попробовал получить остатки по группе товаров тремя способами
    1. ИЗ Остатки() ГДЕ Номенклатура в иерархии ()
    2. ИЗ Остатки(Номенклатура в иерархии () )
    3. Выбрал товары из группы, поместил в виртуальную таблицу и затем соединил эту таблицу с остатками

    Разницы в скорости не заметил (результат ~3000 строк), время выполнения ~1 сек.
    Может, 3000 мало и надо 300 тыс? Как сделать расчет остатков наиболее быстрым способом по известному набору товаров?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  18. zels

    В уроке 8-2-50 говорится, что надо использовать конструкцию «Выразить», а не «ссылка» для отбора номера документа по виду.
    Это не совсем так: надо использовать обе конструкции.
    Если меня интересуют номера документов поступлений товаров и я в запросе к регистру взаиморасчетов пишу «выразить», то запрос возвращает все 400 тыс записей, только номера пустые для случая, когда взаиморасчеты двигаются не поступлением. А если написать «где ссылка», тогда запрос возвращает 11тыс записей.
    Причем если использовать только ссылку, без выразить, то он выполняется практически так же быстро (менее 1 сек на MSSQL), несмотря на гораздо более сложную схему плана запроса.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  19. stop_time

    У меня в УПП,есть фрагмент в запросе
    РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дат, Номенклатура В
    (ВЫБРАТЬ
    СписанныеТовары.Номенклатура
    ИЗ
    СписанныеТовары ГДЕ СписанныеТовары.Регистратор = &Ссылка)
    Анализирую план выполнения этого фрагмента. Получается следующее:
    Вначале вытираются ВСЕ остатки в конце периода 13 милинонов строк, без фильтра по номенклатуре, движения выбираются фильтром с номенклатурой. и потом Nested Loops 13 милионов раз проходится соединяя эти таблицы.
    Как лучше переписать этот фрагмент?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  20. Spakus

    Здравствуйте, Андрей.
    У меня вопрос по полям составного типа.
    Допустим имеется некое поле составного типа, все типы ссылочные.
    Где 1С или СУБД (MS SQL) хранит информацию о том, какой тип в 1С (ПоступлениеТоваровСсылка, ПродажаТоваровСсылка и т.п.) какому типу(значению) в СУБД соответствует? Какими средствами это можно посмотреть?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Spakus

        То что создается несколько колонок это понятно.
        Мне не понятно каким образом определить, что тип «ПоступлениеТоваровСсылка» соответствует в SQL значению «0x000000FA»(значение взято произвольно), а тип «ПродажаТоваровСсылка» соответствует в SQL значению «0x000000FB»?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  21. Шутееев Никита

    Здравствуйте, Андрей. А если не секрет, какая конфигурация используется для запросов в домашних заданиях? Что-то я никак не соображу.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  22. baloo

    Правильно ли я понимаю, что для временных таблиц возможен только один индекс? Допустим у меня 3 поля в ВТ А, Б и В. Допустим запрос выстроен так, что где-то мне нужно соединение по А и Б, где-то по Б, затем по А, а где-то по Б и В. Как быть в этом случае? Создавать отдельную ВТ для каждого соединения?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  23. dubdanseitrp

    Есть вопрос-уточнение по заданию 7: нужно ли индексировать временные таблицы, если предполагается, что в табличной части накладной будет небольшое количество строк (до 20)? Ведь на индексацию тоже уходит время.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  24. imagik

    Добрый день. Не подскажите, как можно избежать конструкции
    Выбор Когда Субконто1 is NULL Тогда
    Когда …
    Иначе
    Конец

    ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • imagik

        Конфигурация «в наследство» досталась, увы.
        Вопро про количество таких комбинаций (Выбор Когда Тогда) в запросе. У меня их количество, по-видимому, превысило какое-то количество и SQL выдал ошибку. На какое количество комбинаций в SQL заложено условие о «превышении»?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  25. Василий Левковский

    В своей тестовой базе при включении итогов (срез последних) для РС цены номенклатуры в консоли запросов увидел вот такую интересную картину. Версия платформы 1С:Предприятие 8.3 (8.3.5.1186). Внутри обе таблицы одинаковые. Можете как-то прокомментировать такой эффект?

    dad8ac49e033c1aeaac174d0ff69fd0d.jpg

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Василий Левковский

        В общем-то я так и решил:) Спасибо

  26. egori

    Есть форма списка журнала документов контрагентов. При его открытие, все обрабатывается мгновенно. Судя по трассировке система просто выбирает первые N записей (N видимо число записей, которые поместится на экране), за определенную дату.
    А вот если указать отбор в журнале, например, по контрагенту, то система задумается на несколько минут. Этот механизм вообще как-то поддается оптимизации? Журнал документов индексирован по контрагенту.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  27. mmch

    Андрей, в курсе вы сказали о новой возможности 8.3 в части использования регистров сведений, и создания дополнительной таблицы итогов.

    Поставил галку — таблица итогов появилась, но у нее один автоматический индекс, а как сделать дополнительный индекс для измерения ВидСтатуса (в основной таблице он он есть…)

    Таблица: РегистрСведений.СКЛ_ИсторияИзмененияСтатусовОбъектов, Имя таблицы хранения: InfoRgSL32157, Назначение: ИтогиСрезПоследних
    — поля:
    (Period)
    Объект (Fld30903)
    ВидСтатуса (Fld30904)
    Статус (Fld30905)
    Пользователь (Fld30906)
    ДокументДвижения (Fld30907)
    — индексы:
    ByDims
    Объект + ВидСтатуса (Fld30903 + Fld30904)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  28. dunaev.anton

    Андрей а можно увидеть запрос 1С из п.5 8-го задания

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • dunaev.anton

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

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  29. Константин Гаевский

    Здравствуйте.

    По вашему решению задания № 7.

    1. Вы индексируете таблицу ВремТаблицаНоменклатура. Заведомо известно, что она будет сканироваться.
    При этом говорите что, если из врем. таблицы будете получать все данные, то нет смысла ее индексировать.
    Проверил, с индексом работает быстрее.

    Все-таки можно ли утверждать, что если индекс есть и он может быть использован, то он будет применен и получен выигрыш в скорости?

    2. В таблице ВремТаблицаОстаток вы используете подзапрос в параметрах вирт. таблицы остатки для измерения номенклатура. Но в параметрах вирт. табл. это не рекомендуется. Проверил, работает медленнее, чем левое соединение по номенклатура.
    Почему вы применяете именно этот прием?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  30. Константин Гаевский

    Здравствуйте.

    Использование МИНИМУМ, МАКСИМУМ для полей составного типа.
    1. При чтении плана запроса с УПОРЯДОЧИТЬ и ПЕРВЫЕ 1 можно ли сказать, что оператор Top запрашивает первую строку у оператора Index scan в котром применено предложение ORDERED?

    2. Если не использовать УПОРЯДОЧИТЬ и ПЕРВЫЕ 1, то в скане индекса нельзя применить предложение ORDERED, что приводит к применению оператора Aggregate ко всей выборке, возвращаемой сканом. В результате — замедление. Верно?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  31. igor@kozlitin.net

    Андрей,

    Вот Вы рекомендуете не использовать соединения с подзапросами, а разбивать запрос на части и использовать временные таблицы. В случае MSSQL это выглядит логично и органично, а вот в случае, например, Oracle у меня уже возникают вопросы. А именно, как 1С транслирует на запросы Oracle использование временных таблиц? Ведь в Oracle нет такого понятия временных таблиц, как это есть в MSSQL.
    Некоторое время назад я читал статью Тома Кайта (известного специалиста по Oracle) где он отвечал на вопрос программиста имевшего опыт в разработке на MSSQL и который хотел перейти на Oracle. Вопрос касался того, как же быть без временных таблиц в Oracle. Том Кайт ответил, что концепции в MSSQL и Oracle отличаются и что он настолько уверен в оптимизаторе Oracle, что рекомендует использовать его потенциал полностью, в том числе нагружая его подзапросами. Как Вы относитесь к такому мнению?
    Заранее спасибо за ответ.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  32. ASer

    Может опечатка в условии?
    ———————
    // Остаток по товару должен быть больше установленного лимита
    Если (ВыборкаЛимитов.Лимит < ВыборкаОстатков.Остаток — ВыборкаОстатков.Количество) Тогда
    Сообщить ("Документ не проведен!");
    Отказ = Истина;
    КонецЕсли;
    —————————
    Если (ВыборкаЛимитов.Лимит 100-95
    или
    2) Если НЕ (ВыборкаЛимитов.Лимит < ВыборкаОстатков.Остаток — ВыборкаОстатков.Количество) Тогда
    Сообщить ("Документ не проведен!");
    Отказ = Истина;
    КонецЕсли;
    ——————-
    Почему-то не сохраняется полностью мой текст ((((

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • ASer

        Я просто стараюсь прогнать всю теорию и практические задания через тестовые базы )))

  33. lexbond

    Вы пишите:

    «В ИЕРАРХИИ надо стараться не использовать, лучше предварительно собрать список элементов из этой иерархии во врем таблицу, а потом в основном запросе написать
    Или Поле1 В (Выбрать Поле1 ИЗ ВТ_ЭлементыИЗИерархии)
    Или сделать внутреннее соединение со врем таблицей: Таб1 Внутреннее соединение ВТ_ЭлементыИЗИерархии ПО Таб1.Поле1= ВТ_ЭлементыИЗИерархии.Поле1»

    1. Насколько я видел в profiler, при использовании В ИЕРАРХИИ платформа автоматичекси создает временную таблицу, заполняет ее за несколько проходов и использует в запросе. Это так?
    2. Как самостоятельное заполнение поможет решить проблему скорости?
    3. Как самостоятельно ее заполнить эффективнее, чем платформа?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  34. lexbond

    Задание №7. Решение преподавателя.

    1. Почему в последнем запросе использовано внутреннее соединение, а не левое? А если есть не все остатки или лимиты.
    2. Поскольку задача на оптимизацию, то можно в последнем запросе использовать «Первые 1».

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  35. Eugeeny

    Здравствуйте, Андрей. У меня такой вопрос: Имеется база УПП объемом за 100ГБ. В этой базе работают единовременно не более 30 пользователей. Первые четыре месяца Расчет себестоимости выпуска проводился за 4-6 часов, это 7 операций, а распределение и расчет прямых затрат за 2 -2,5 часа. Внезапно, с пятого месяца время проведения распределения и расчета прямых затрат увеличилось до 7 часов. Статистики обновлял, кэш не чистил, у нас СУБД MS SQL 2008R2. План запроса получить не просто, учитывая время проведения документа. А можно предположить в чем проблема до получения и разбора плана запроса? Могут ли данные влиять на скорость выполнения запрос?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

    • bru_10

      У нас изменили способ распределения затрат в одном месяце, добавили фильтры, в итоге расчет себестоимости начал проводиться вместо 20 минут 3-4 часа.

  36. Алексей Жуков

    Андрей, добрый день.
    В одном из уроков прозвучала рекомендация по возможности не указывать период в виртуальной таблице остатков. Заметил, что при указании параметра периода, равной началу месяца план запроса также получается облегченный (конечно при условии рассчитанных итогов за указанный период). Можно ли быть постоянно уверенным в оптимальности запроса получения остатка на начало любого рассчитанного в системе месяца или есть какие-либо подводные камни?
    Спасибо.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  37. Сергей

    Вопросы по эталонному решению.
    1. В параметрах вирт.таблицы ТоварыНаСкладах.Остатки в поле период стоит &Склад. Наверное это ошибка.
    2. Проверка на лимиты в запросе — это наверное хорошо, но как понять из результатов запроса нужно ли проводить документ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • kambou

        Но пустой запрос не даст нам сформировать движения по регистрам документа. Поэтому в своем решении я предложил вариант, в котором есть поле «ПревышенЛимит» типа «Булево» и сделал в окончательном запросе по этому полю упорядочивание по убыванию. При чтении выборки в цикле, если у нас есть действительно превышение лимита, то в первой итерации цикла будет выведено сообщение об ошибке и дальнейшее проведение документа будет прервано, а если превышение лимита нет, то в цикле формируются движения по регистру.

  38. bas

    Андрей, добрый день!

    Встречался на практике примерно со следующей ситуацией. Например, есть регистр, в котором хранятся остатки для 1 млн. значений измерения. Нам необходимо получить остатки только для 100 тыс. значений измерения. Предварительно эти 100 тыс. значений собраны во временную таблицу, например ВТ_ЗапрашиваемыеЗначения.
    И далее получается, что намного быстрее: взять остатки по ВСЕМ значениям измерения, поместить их во временную таблицу и в следующем запросе отсечь лишнее соединением с временной таблицей ВТ_ЗапрашиваемыеЗначения,

    нежели

    указывать в параметрах вирт. таблицы отбор по данному измерению: Измерение В (Выбрать ВТ_ЗапрашиваемыеЗначения.Измерение Из ВТ_ЗапрашиваемыеЗначения).

    Т.е. получается, что если мы читаем достаточно существенную порцию большого регистра, то лучше не использовать отбор на эту порцию в параметрах виртуальной таблицы?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

    • GilevSlava

      думаю что учитывать характеристики мест хранения данных тоже есть смысл, если сделать РАМ-диск и разместить там темпдб, то ситуация может быть другой
      т.е. значимым является «стоимость» потребления тех или иных ресурсов

  39. Eugeeny

    Андрей, добрый день!
    В каких случаях уместно во временных таблицах, в запросах, использовать закладку индекс? Какие поля нужно индексировать? Каким образом «ИНДЕКСИРОВАТЬ ПО» влияет на оптимизатор СУБД?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • bas

        В статье http://kb.1c.ru/articleView.jsp?id=44 есть фраза: «Внимание! Не забудьте проиндексировать созданную временную таблицу. В качестве индексных полей следует указать все поля, которые используются в условии соединения.» Также она продублирована в «Настольной книге эксперта» на стр. 188.

        1. Т.е. получается, что нужно ВСЕГДА индексировать поля временной таблицы, которые участвуют в соединении?

        2. Правильно я понимаю, что если оптимизатор выбирает для соединения hash match или merge join, то наличие/отсутствие индексов по полям соединения никак не влияет на скорость выполнения соединения?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  40. konst5

    Здравствуйте!
    Хотел уточнить, как хранятся итоги среза первых/последних для регистра сведений в 8.3. Итоги хранятся только на актуальную дату (3999-11-01) или для всех дат? Остатки по регистру накопления, например, хранятся по месяцам, а на промежуточные даты рассчитываются с учетом оборотов.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  41. StaticUnsafe

    Здравствуйте. Есть ли какие-нибудь рекомендации по использованию условия «В». Если в запрос передаётся массив значений и на поле накладывается условие «В» ? Если передаётся таблица значений и накладывается условие «В» по нескольким полям? Нужно ли предварительно выбирать данные из массива/таблицы значений в во временную таблицу, индексировать и только потом соединять?
    Так же интересуют особенности работы с индексами оператора «В ИЕРАРХИИ».

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • StaticUnsafe

        Доброе утро. Правильно ли я понял, что при передаче в запрос массива значений (пусть даже разного типа) и при использовании условия МоёПоле В (&МойМассив) индекс будет использоваться?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

          • StaticUnsafe

            Т.е. переданный массив индексируется СУБД автоматически?

            • Андрей Бурмистров


              (текст комментария доступен только участникам Мастер-группы)

              • StaticUnsafe

                Если идет замена на OR и индексы используются, тогда как быть с информацией из видео «35.Условия, не позволяющие использовать индекс. ИЛИ».
                Что я упускаю из виду? Когда OR это хорошо а когда плохо?

                • Андрей Бурмистров


                  (текст комментария доступен только участникам Мастер-группы)

  42. SergTH000

    Андрей, добрый день. У меня такой вопрос, допустим есть два регистра Остатки и Продажи. измерения, ресурсы одинаковые — номенклатура и количество. Нужно получить таблицу вида Номенклатура, КоличествоОстаток, ПродажиЗаПериод. Есть два варианта — соединить эти регистры или объединить с последующей группировкой. Делал замеры — время выполнения примерно одинаковое. Вопрос что лучше использовать и при каких условиях, может общие рекомендации какие есть?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  43. Alximikkk

    Андрей, здравствуйте!
    У меня такой вопрос: как лучше делать, с точки зрения производительности, соединять 3-4 таблицы разом или постепенно соединять их, используя временные таблицы?
    На создание ВТ и индексацию ведь тратятся определенные ресурсы, но зато текст запроса получается более читаемый и аккуратный что ли.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  44. gosn1ck

    Андрей, не помню в каком занятии вы говорили об эскалации и гранулярности, подскажите, а где посмотреть эти сущности, то есть как увидеть что СУБД выполнила эскалацию и это свойство гранулярности ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  45. Василий Левковский

    Добрый день

    Есть ли какие-то негативные последствия если включать флаги «разрешить итоги (срез последних/первых)» для регистров сведений, подчиненных регистратору.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  46. Василий Левковский

    Добрый день. Вопрос по использованию таблиц среза последних для регистра сведений в 8.3. Встречались ли Вы со такими случаями, когда запрос при установке флага «разрешить итоги» запрос к таблице среза последних может возвращать разные данные, если указывать дату в параметрах виртуальной таблицы, и если не указывать? То есть запросы вида Выбрать * ИЗ РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,) И Выбрать * ИЗ РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(,) возвращают разные данные, даже если параметр Дата равен концу текущего дня. У меня встречалась такая проблема и я так до конца и не понял, в чем дело и как с этим бороться.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  47. Михаил Черненко

    А если есть вопрос по 7-му заданию, который может раскрывать часть решения, его тоже тут задавать ? (Вопрос вида «а будут ли вот такие-то дополнительные действия оптимизировать код? «) Или эти вопросы описать сразу в решении?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Михаил Черненко

        Я имел ввиду, что есть вопросы к вам по материалам занятия:

        1. Нужно ли индексировать виртуальную таблицу, если мы ее группируем? (Перед группировкой табличная часть сортируется?)
        2. А если в ТЧ Товары установить свойство “Индексировать” реквизиту “Номенклатура”, будет ли вариант оптимизации “соединить табличную часть с таблицами остатов и лимитов, а потом уже группировать” хуже/равнозначен/лучше, чем вариант ” поместить табличную часть в виртуальную таблицу, а потом соединять ” ?
        3. По 3-му вопросу, судя по решению, я правильно понимаю, что нет смысла «оптимизировать» установку параметра запроса СпрСклады.НайтиПоНаименованию(“Основной”) путем переноса этого поиска в основной запрос?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  48. Sieg Heil

    В образце решения ПР №7 маленький недочет: «потеряно» условие по складу в фильтре виртуальной таблицы остатков РН

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Еникеев Марат

        Параметр &Склад на месте периода, должно быть &Склад И …

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  49. EzYCaT

    Есть вопрос по практическому заданию №7: логика при разборе кода должна быть сохранена?
    Сейчас получается, что запрос и проверка на лимиты работают только для одного склада «Основной». Также проверка на лимиты не работает, если товара нет в остатке.

    Нужно ли обращать внимание на эти моменты при решении или задача состоит только в оптимизации запросов?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • EzYCaT

        Всё понял.
        На странице с ответами на практическое задание 8 не закрыты комментарии :)

        • Татьяна Гужавина

          Добрый день!
          На странице с заданием 8 нужно только отчитываться о выполнении задания.

  50. crabzzy

    По одному из 5 запросов задания 8 есть вопрос.
    Он синтаксически некорректен. Либо так задумывалось, либо он другой.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • crabzzy

        Андрей, добрый день,
        практическое-задание-08
        Практическое задание 8-3.txt

        Ошибся, всё хорошо, кроме префикса РМС_ у псевдонима таблицы (РМС_УпаковкиВДокументах), т.к. далее используется без префикса в соединении.

        Текст запроса:

        ВЫБРАТЬ
        УпаковкиВДокументах.Упаковка.Ссылка КАК Упаковка
        ПОМЕСТИТЬ ОтгруженныеУпаковки
        ИЗ
        РегистрСведений.УпаковкиВДокументах КАК РМС_УпаковкиВДокументах
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ УпаковкиВДок КАК УпаковкиВДок
        ПО УпаковкиВДокументах.Упаковка.Ссылка = УпаковкиВДок.УпаковкиВДокументах.Ссылка
        ГДЕ
        УпаковкиВДокументах.Документ.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты