Правильные запросы в 1С

Здравствуйте, дорогие читатели!

Самым быстрым по производительности способом получения данных в системе «1С Предприятие 8» является работа с запросом. Поэтому чаще всего Вам придется пользоваться именно этой техникой.

Запрос представляет собой текст на специальном языке запросов. В этом тексте
описывается, что является источником информации для запроса, а также
указываются условия для построения запроса. Более приближенно к системе
«1С Предприятие» источник информации можно определить так: какие таблицы
информационной базы используются в качестве источников данных для запроса,
а также какие поля таблиц требуется обрабатывать в запросе. А вот какими подходами и методами при этом руководствоваться – в большинстве случаев это остается на усмотрение сервера «1С Предприятия» (который переводит наш запрос на языке 1С на язык запросов СУБД) и оптимизатора СУБД (который подбирает оптимальный сценарий получения данных).

Например: В своем запросе мы требуем отобрать из справочника «Номенклатура» все услуги, основным поставщиком которых является «Абдулов». При этом реквизит «Услуга» булевого типа, а реквизит «ОсновнойПоставщик» — тип справочник «Контрагенты». Оба реквизита индексированы.

Для оптимизатора СУБД есть несколько вариантов выполнения этого запроса:

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

Оптимизатор СУБД выбирает и анализирует лишь некоторое количество вариантов выполнения запроса и выбирает «лучший из них».  При этом возникает вероятность, что по-настоящему оптимальный вариант остался даже не рассмотренным. Поэтому чтобы помочь оптимизатору СУБД в выборе оптимального варианта выполнения нашего запроса рекомендуется придерживаться следующих правил:

  1. По возможности условие ИЛИ заменять  операцией ОБЪЕДИНИТЬ ВСЕ. Чтобы убедиться в том, что нужна замена, можно сделать так: выполнить запрос с условием на равенство по одиночному значению поля, а потом запрос с условием ИЛИ по этому полю на большой таблице. Если второй запрос выполняется намного дольше, чем первый, то данный запрос можно переписать.
  2. Условие «не равно» (<>) тоже может отключать использование индекса. Например если необходимо исключить большую часть таблицы, а поле отбора проиндексировано, – есть смысл переписать запрос на вариант ОБЪЕДИНИТЬ ВСЕ
  3. В условиях соединений, стараться обходиться без использования вложенных запросов и виртуальных таблиц, а так же лишних разыменований (выражений через несколько точек). Вложенные запросы и виртуальные таблицы рекомендую заменить на временные таблицы.
  4. Стараться избегать в условии «В ИЕРАРХИИ» содержания пустой ссылки. Возможно ситуация когда оптимизатор СУБД начнет проверять каждый элемент справочника на принадлежность корню (т.е. самому справочнику), теряя на этом время.
  5. Следует использовать ОБЪЕДИНИТЬ ВСЕ вместо ОБЪЕДИНИТЬ, если наличие одинаковых записей не критично. Оператор ОБЪЕДИНИТЬ использует дополнительные операции, которые могут занять много времени.
  6.  Условие «ПОДОБНО» подавляет использование индекса.
  7.  Если запрос содержит несколько условий, то они должны располагаться в порядке уменьшения эффекта от выбора. То есть первым надо делать то условие, которое максимально уменьшит результирующую таблицу.
  8. Максимально использовать индексы таблиц. Необходимо стараться чтобы для всех условий, использованных в запросе, имелись подходящие индексы. Подходящий индекс — это индекс, который содержит все поля перечисленные в условии, эти поля находятся в самом начале индекса и они расположены вместе, т.е между ними нет других полей.
  9. Не рекомендуется фильтровать виртуальные таблицы при помощи условий в секции ГДЕ и т.п. Надо использовать только параметры.
  10. Стараться для ссылочных полей, по которым будет вывод, получать представление  сразу в запросе, т.е. использовать конструкцию «ПРЕДСТАВЛЕНИЕ(НашаСсылка)«
  11. Если в запросе реализовано соединение двух и более таблиц, то эти таблицы должны стоять в запросе в порядке уменьшения количества записей в них, а в части условий (ГДЕ) первым должно стоять условие на первую таблицу.
  12. Если запрос содержит условие для проиндексированного (относится к некластерному индексу) поля маленькой таблицы, которая может быть считана за одно обращение к памяти, то лучше убрать индекс с этого поля в конфигурации.
  13.  Условия вхождения значений полей в результаты вложенных запросов лучше заменять на внутренние соединение по равенству этого поля для ситуаций, когда есть вероятность получения больших размеров таблиц результатов вложенных запросов. Т.е. конструкцию «Поле1 В (Выбрать Поле1 из Таблица2)» заменить на «ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 По Таблица1.Поле1 = Таблица2.Поле1«

Популярность: 15%

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.