Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51771
Скачиваний: 8724
Рис. 4.4. Свойства измерений «Ведущее» и «Индексировать»
Поэтому в случае установки свойства Ведущее для измерения Номенклатура, а затем
установки свойства Индексировать для измерения ХарактеристикаНоменклатуры у
таблицы регистра в базе данных будут созданы дополнительные индексы, показанные на
рис. 4.5.
Рис. 4.5. Основные и дополнительные индексы таблицы регистра при индексировании измерений
Понятно, что в некоторых случаях, чтобы не усложнять индексы, достаточно изменить
порядок следования измерений регистра в конфигураторе. Например, если поставить
ведущее измерение на первое место, то вместо двух индексов будет создан один.
Свойство Индексировать есть также у некоторых реквизитов объектов метаданных,
например у справочников, документов и т. п. Это свойство позволяет указать системе,
что нужно создать дополнительный индекс, содержащий соответствующий реквизит.
Кроме значения Индексировать для большинства объектов можно установить значение
Индексировать с доп. упорядочиванием.
Например, для неиерархического неподчиненного справочника в базе данных
автоматически создаются индексы:
Ссылка;
Код + Ссылка (если длина кода не равна 0);
Наименование + Ссылка (если длина наименования не равна 0).
Если для реквизита справочника установить свойство Индексировать в значение
Индексировать/Индексировать с доп. упорядочиванием, для таблицы справочника в
базе данных будут созданы дополнительные индексы, показанные на рис. 4.6:
Реквизит + Ссылка (если для реквизита свойство Индексировать установлено в
значение Индексировать);
Реквизит + Код + Ссылка (если для реквизита свойство Индексировать
установлено в значение Индексировать с доп. упорядочиванием, длина кода не
равна 0 и основное представление справочника задано в виде кода);
Реквизит + Наименование + Ссылка (если для реквизита свойство Индексировать
установлено в значение Индексировать с доп. упорядочиванием, длина
наименования не равна 0 и основное представление справочника задано в виде
наименования).
Рис. 4.6. Основные и дополнительные индексы таблицы справочника при индексировании реквизитов
Вариант индексирования Индексировать с доп. упорядочиванием предназначен, прежде
всего, для использования в динамических списках. В этом случае индекс строится по
реквизиту, а также по некоторому полю, которое обычно используется для
упорядочивания объектов этого типа.
При выборе значения свойства Индексировать нужно исходить из того, какие варианты
выборки информации необходимо оптимизировать в первую очередь. Если требуется
только поиск с помощью запроса объектов по данному реквизиту без упорядочивания, то
можно установить значение Индексировать, чтобы создаваемый индекс требовал
меньше ресурсов системы. Если требуется просмотр списка с отбором по реквизиту, то
имеет смысл использовать вариант Индексировать с доп. упорядочиванием.
Если объект конфигурации включен в критерий отбора, то создается дополнительный
индекс по реквизиту, который включен в состав критерия отбора. Например, если
справочник включен в критерий отбора через реквизит ДатаРождения, то у таблицы
справочника будет создан дополнительный индекс по этому реквизиту (рис. 4.7).
Рис. 4.7. Основные и дополнительные индексы таблицы справочника при включении реквизита в состав критерия
отбора
Эффективное использование индексов
Чтобы понять, эффективно запрос использует индексы или нет, нужно посмотреть текст
запроса, определить таблицы – источники запроса и выделить те поля, которые
используются в условиях запроса (в предложении ГДЕ, в условии соединения таблиц ПО,
в параметрах виртуальных таблиц, в предложении ИМЕЮЩИЕ).
Затем нужно сравнить их с индексами, которые создает система для исходных таблиц
запроса. Если нужных для эффективного выполнения запроса индексов не хватает,
следует создать дополнительные индексы описанными выше способами.
Ниже мы рассмотрим некоторые задачи по получению информации из таблиц базы данных
и варианты индексирования этих таблиц, оптимальные для выполнения соответствующих
запросов.
Пример 1
Пусть необходимо получить движения регистра ТоварыНаСкладах, отражающие
поступления от производителей. Для этого нужно выполнить отбор движений по значению
реквизита регистра ВидОперации с помощью следующего запроса (листинг 4.1).
Листинг 4.1. Отбор движений регистра накопления по значению реквизита
В данном запросе источником данных является таблица движений регистра накопления
остатков ТоварыНаСкладах, который имеет измерения Номенклатура и Склад, ресурс
Количество и реквизиты Поставщик, ВидОперации. Измерения и реквизиты регистра не
проиндексированы, т. е. свойство Индексировать для них установлено в значение Не
индексировать.
В этом случае для таблицы движений этого регистра платформа автоматически создаст
индексы:
Период + Регистратор + НомерСтроки,
Регистратор + НомерСтроки.
В условии запроса, в предложении ГДЕ, накладывается отбор на значение реквизита
регистра ВидОперации. То есть подходящий индекс, содержащий в самом начале поле,
на которое накладывается условие, в таблице отсутствует.
В этом случае при выполнении запроса будут выбраны все записи движений регистра, а
затем, путем перебора этих записей, будут получены записи с нужным значением
реквизита.
Чтобы при выполнении запроса происходило обращение сразу к записям с указанным
значением реквизита, для реквизита ВидОперации свойство Индексировать следует
установить в значение Индексировать. В этом случае в таблице движений регистра
будет создан дополнительный индекс:
ВидОперации + Период + Регистратор + НомерСтроки.
Этот индекс полностью покрывает условия запроса и позволит осуществить
эффективный поиск записей в таблице движений регистра накопления.
Пример 2
Пусть необходимо получить данные о продажах товаров конкретному покупателю за
указанный период с разворотом по неделям из оборотного регистра накопления Продажи.
Для этого нужно выполнить следующий запрос (листинг 4.2).
Листинг 4.2. Вывод оборотов товаров по выбранному контрагенту за заданный период с периодичностью «Неделя»