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