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