#std732

Запросы в динамических списках

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

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

1.

Старайтесь делать запросы динамических списков максимально простыми.

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

Пример

В списке документов-распоряжений на отгрузку нужно выводить состояние отгрузки. Состояние зависит от остатков регистра накопления и статусов двух других документов.

Неправильно

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

Правильно

Хранить рассчитанное состояние в регистре сведений СостоянияОтгрузки. Пересчет выполнять при проведении документов, влияющих на состояние, или отдельным регламентным заданием.

2.

Выберите один из трех режимов работы динамического списка:

  • Динамическое считывание данных включено (рекомендуется): запросы выбирают количество записей, близкое к числу видимых строк таблицы;
  • Динамическое считывание данных выключено, задана не виртуальная основная таблица или одна из таблиц СрезПервых, СрезПоследних, ЗадачиПоИсполнителю, КритерииОтбора, ДвижениеСубконто: запрос выбирает по 1000 записей в серверный буфер, данные передаются на клиент по мере необходимости; менее эффективно, чем динамическое считывание;
  • Динамическое считывание данных выключено, основная таблица не задана: запрос выполняется «как есть»; буфер накапливает данные, начиная с 1000, и объем растет по мере движения к концу списка; режим применим только для заведомо маленьких выборок.
3.

Фактический запрос к СУБД зависит от предопределенных настроек отборов, порядка и группировок СКД.

Поэтому рассматривайте индексирование полей:

  • по которым выполняются соединения;
  • на которые наложены условия;
  • выведенных как быстрые отборы;
  • по которым выполняются сортировки или группировки;
  • по которым ожидаются частые пользовательские сортировки/группировки.

Не индексируйте поля «на всякий случай»: избыточные индексы создают лишнюю нагрузку при записи.

См. также
4.

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

  • РАЗЛИЧНЫЕ и СГРУППИРОВАТЬ ПО;
  • ВЫБОР в ГДЕ или в условиях соединения;
  • сортировку по полю, полученному с помощью конструкции ВЫБОР, в том числе пользовательскую.
См. также

#std729: Общие требования по разработке оптимальных запросов.

5.1.

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

Не рекомендуется соединяться:

  • с большим числом реальных таблиц (ориентир - не более 4);
  • с вложенными запросами;
  • с виртуальными таблицами.
См. также

#std655: Запросы, выполняющие соединение с вложенными запросами или виртуальными таблицами.

5.2.

Соединение с виртуальными таблицами допустимо только в отдельных случаях, если запрос и архитектура данных удовлетворяют условиям:

5.3.

Временные таблицы в динамических списках используйте с учетом требований ниже и стандарта #std777: Использование временных таблиц.

5.3.1.

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

Иначе это неэффективно: значения временных таблиц в динамическом списке не кешируются и формируются при каждом чтении данных списка.

5.3.2.

Если запрос не удается переписать с использованием виртуальных таблиц в допустимых ограничениях (см. п. 5.2) или с полным отказом от них, используйте соединения с временными таблицами.

5.3.3.

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

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

5.4.

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

Подробнее: #std654: Разыменование ссылочных полей составного типа в языке запросов.

5.5.

При работе под неполными правами, где настроены ограничения доступа к данным (RLS), к таблицам запроса автоматически добавляются условия RLS, что замедляет список.

Скорость динамических списков проверяйте именно в этом режиме.

Примечание

Это касается таблиц, для которых в конфигурации действительно предусмотрен RLS.

6.

Предусматривайте оптимизацию при работе с полями составного типа:

Пример

ВЫРАЗИТЬ(ДанныеДокумента.ДокументОснование КАК Документ.АктВыполненныхРабот)
См. также

#std654: Разыменование ссылочных полей составного типа в языке запросов.

7.

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

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

См. также

#std768: Программное переопределение текстов запросов динамических списков.

8.

Если рекомендации выше неприменимы или не дают нужного эффекта, рассмотрите дополнительные пути оптимизации.

8.1.

Откажитесь от части возможностей динамического списка.

Например:

  • от вывода второстепенной информации, получение которой усложняет запрос;
  • от сервисных возможностей группировки списка.
8.2.

Выводите данные не в динамический список, а в таблицу значений или дерево значений.

Так становятся доступны оптимизации, которые недоступны для динамических списков (например, использование привилегированного режима).

Подход применим, если выполняется одно из условий:

  • исходных данных заведомо мало (десятки-сотни записей);
  • обязательные отборы гарантируют, что одновременно выводится мало записей;
  • порционность вывода организована вручную (например, как в результатах полнотекстового поиска).
9.

Если в динамическом списке нужны вспомогательные колонки, по которым не требуется отбор/поиск/сортировка/группировка, и их затруднительно, неэффективно или невозможно получить основным запросом, используйте обработчик ПриПолученииДанныхНаСервере таблицы управляемой формы.

Пример таких колонок: Курс на сегодня, Кратность в списке валют.

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

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

  • УстановитьОграниченияИспользованияВГруппировке;
  • УстановитьОграниченияИспользованияВПорядке;
  • УстановитьОграниченияИспользованияВОтборе.
Источник

https://its.1c.ru/db/v8std#content:732