Как в 1С оптимизировать запрос – пример ускорения в 6 раз

23.10.14

База данных - HighLoad оптимизация

Что Вы узнаете из этой статьи?

• Одну из основных причин медленной работы запросов
• Анализ возможных методов ускорения запросов
• Эффективный способ ускорения запросов, в которых происходит обращение через «2 точки»

Скачать файлы

Наименование Файл Версия Размер
Как в 1С оптимизировать запрос – пример ускорения в 6 раз
.pdf 450,75Kb
13
.pdf 450,75Kb 13 Скачать

 

 

Часто при внедрении программ «1С: Предприятие 8» возникают ситуации, в которых простые запросы работают достаточно медленно.

Покажем варианты оптимизации таких запросов.

Для примера рассмотрим запрос из реального проекта (в базе клиента он выполнялся более 6 секунд

 

ВЫБРАТЬ

ДенежныеСредстваКПоступлениюБезналичныеОбороты.Документ.Контрагент.Партнер,

МЕСЯЦ(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Месяц,

ГОД(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Год,

СУММА(ДенежныеСредстваКПоступлениюБезналичныеОбороты.СуммаПриход) КАК СуммаПриход

ИЗ

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(, , Месяц, Документ.Контрагент.Партнер = &Партнер)

КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты



СГРУППИРОВАТЬ ПО

ДенежныеСредстваКПоступлениюБезналичныеОбороты.Документ.Контрагент.Партнер,

МЕСЯЦ(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период),

ГОД(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период)

 

C первого взгляда все хорошо, но опытный программист увидит неоптимальный код в запросе.

Источником проблем выступает параметр виртуальной таблицы, а точнее – обращение через «две точки» в фильтре.

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

Самым первым вариантом решения в голову приходит использовать конструкцию языка запросов «ВЫРАЗИТЬ», чтобы привести поле «Документ» к некоторому определенному типу. Это позволит избежать соединений с лишними таблицами. Но по ряду ограничений данный вариант не подходит:

  1. Нам нужны все документы, содержащиеся в составном типе. Таковы условия постановки задачи. Получается, что необходимо фильтровать все типы документов, входящие в составной тип.
  2. Даже если бы не было предыдущего ограничения, то обращение через «две точки» никуда не делось.
  3. Если бы можно было использовать «ВЫРАЗИТЬ», то это не спасало бы ситуацию: в параметрах виртуальной таблицы «ВЫРАЗИТЬ» не дает прироста производительности.

 

Оптимизация

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

Из нескольких способов решения задачи предлагаем два следующих варианта: 

 

Вариант 1

В регистр «ДенежныеСредстваКПоступлениюБезналичные» добавить новое измерение «Партнер», заполняя его при записи движений документов. Ввиду использования условия по данному измерению его необходимо проиндексировать.

После внесенных нами изменений у нас достаточно легко получится наложение фильтра на новое измерение в параметрах виртуальной таблицы: 

 

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(, , Месяц, Партнер = &Партнер) КАК

КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

 

Что мы видим? Этот запрос начинает работать моментально. И это, к сожалению, единственный положительный момент, минусов наблюдается существенно больше. Главный минус – изменение структуры конфигурации, возникают проблемы при последующих обновлениях, использовании типовых обменов и т.д. К тому же у нас хранится дублируемая информация, что приводит к увеличению размера таблицы, а установка признака индексирования повышает скорость чтения, но при этом замедляет запись в регистр. Поэтому рассмотрим второй вариант.

 

Вариант 2

Можно попробовать изменить запрос так, чтобы фильтр по полю «Документ» накладывался примерно следующим образом: 

 

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(, , Месяц, Документ В (ВЫБРАТЬ Ссылка ИЗ

ВТ_ДокументыСПартнером)) КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

 

Что необходимо сделать, чтобы наш запрос пришел к подобному виду? Вначале соберем все документы, входящие в составной тип поля «Документы». Для них должно соблюдаться условие: 

 

Контрагент.Партнер = &Партнер

 

В нашем составном типе определены 5 документов, причем искомый реквизит «Контрагент» присутствует только в документах:

  • ПоступлениеБезналичныхДенежныхСредств
  • СписаниеБезналичныхДенежныхСредств
  • РасходныйКассовыйОрдер
  • ОперацияПоПлатежнойКарте

Далее сформируем временную таблицу для фильтрации. В ней будут документы, у которых реквизит «Партнер» равен нужному значению. Применим полученный фильтр по документам в нашем запросе: 

 

ВЫБРАТЬ ОперацияПоПлатежнойКарте.Ссылка

ПОМЕСТИТЬ ВТ_ДокументыСПартнером

ИЗ Документ.ОперацияПоПлатежнойКарте КАК ОперацияПоПлатежнойКарте

ГДЕ ОперацияПоПлатежнойКарте.Контрагент.Партнер = &Партнер


ОБЪЕДИНИТЬ ВСЕ


ВЫБРАТЬ ПоступлениеБезналичныхДенежныхСредств.Ссылка

ИЗ Документ.ПоступлениеБезналичныхДенежныхСредств КАК ПоступлениеБезналичныхДенежныхСредств

ГДЕ ПоступлениеБезналичныхДенежныхСредств.Контрагент.Партнер = &Партнер


ОБЪЕДИНИТЬ ВСЕ


ВЫБРАТЬ РасходныйКассовыйОрдер.Ссылка

ИЗ Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер

ГДЕ РасходныйКассовыйОрдер.Контрагент.Партнер = &Партнер


ОБЪЕДИНИТЬ ВСЕ


ВЫБРАТЬ СписаниеБезналичныхДенежныхСредств.Ссылка

ИЗ Документ.СписаниеБезналичныхДенежныхСредств КАК СписаниеБезналичныхДенежныхСредств

ГДЕ СписаниеБезналичныхДенежныхСредств.Контрагент.Партнер = &Партнер

;


////////////////////////////////////////////////////////////////////////////////


ВЫБРАТЬ


&Партнер,


МЕСЯЦ(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Месяц,

ГОД(ДенежныеСредстваКПоступлениюБезналичныеОбороты.Период) КАК Год,

ДенежныеСредстваКПоступлениюБезналичныеОбороты.СуммаПриход КАК СуммаПриход

ИЗ

РегистрНакопления.ДенежныеСредстваКПоступлениюБезналичные.Обороты(,, Месяц, Документ В

(ВЫБРАТЬ

ВТ_ДокументыСПартнером.Ссылка

ИЗ

ВТ_ДокументыСПартнером)) КАК ДенежныеСредстваКПоступлениюБезналичныеОбороты

 

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

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


Резюме

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

Рекомендуем оптимизировать запросы посредством изменения текста самого запроса.


Анализ плана выполнения запроса с помощью консоли запросов

 

  

В этом видео показан наиболее простой способ получения плана выполнения запроса на СУБД – для этого используется официальная консоль запросов от фирмы «1С».

С помощью этого инструмента можно быстро оценить эффективность выполнения запроса и необходимость его оптимизации.

 


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

 

Другие полезные статьи и видео смотрите на нашем сайте: http://

Ускорение Производительность Запросы Оптимизация Обучение Курсы-по-1С.рф Гилев Насипов Spec8.ru Spec8 NasF

См. также

Как эффективно настроить autovacuum в Postgres для 1С

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Кто не любит убирать мусор? Думаю, практически все, а вот в Postgres это обязательный ритуал для эффективной работы. Как эффективно настроить уборку за 1С в Postgres, можно прочитать в этой статье и еще раз задуматься о бесплатности Postgres.

05.08.2023    3515    1CUnlimited    4    

43

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    7846    Филин    37    

92

Простой способ проверки быстродействия

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Простой (а точнее, мегапростой) способ проверки быстродействия, когда очень важно его, быстродействие, улучшить

10.04.2023    3050    vkrivov@yandex.ru    15    

36

Пример многопоточной обработки (БСП)

HighLoad оптимизация БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка-шаблон, на основе которой можно делать свои многопоточные обработки данных для конфигураций на БСП.

13.02.2023    7606    6    echo77    8    

83

Нагрузочное тестирование в 1С:ERP

HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Для того чтобы еще до внедрения информационной системы убедиться, что целевая система справится с ожидаемой нагрузкой, требуется провести нагрузочное тестирование. О том какие инструменты и методики помогут организовать подобный проект при внедрении 1С:ERP, и о том, какие неожиданные факторы могут влиять на производительность системы я и хотел бы рассказать в данной статье.

02.11.2022    5227    Tavalik    23    

38