#std452

Поиск в коллекциях значений

1.

При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк рекомендуется:

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

Иначе индексирование может не дать эффекта и даже ухудшить производительность из-за лишних затрат на построение индекса.

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

2.

Для поиска в ТаблицаЗначений предусмотрены методы:

  • Найти();
  • НайтиСтроки().

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

2.1.

Не используйте Найти() для поиска по нескольким колонкам в больших таблицах значений. Этот метод применяет индекс только по одному полю.

Пример

ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
... = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!

Даже при наличии индексов по Колонка1 и Колонка2 поиск выполняется полным перебором строк.

2.2.

Для НайтиСтроки() список полей индекса должен точно совпадать со списком полей в структуре поиска (порядок полей не важен). Если поля не совпадают, индекс не используется и выполняется полный перебор.

Пример

ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2

... = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1", "Ищу2")); // Индекс НЕ используется!
... = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1")); // OK - используется Индекс1
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2")); // OK - используется Индекс2

Другой пример

ТЗ.Индексы.Добавить("Колонка1,Колонка2");

... = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1", "Ищу2")); // OK - индекс используется
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2", "Ищу1")); // OK - индекс используется
... = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1")); // Индекс НЕ используется!
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2")); // Индекс НЕ используется!
2.3.

То же ограничение действует для метода Скопировать() таблицы значений при вызове с параметром ПараметрыОтбора типа Структура.

3.

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

Поэтому рекомендуется:

  • если нужна сортировка по наименованию, заранее добавлять колонки с представлениями и сортировать по ним;
  • в остальных случаях сортировать «по ссылке», а не по представлению. Для этого в Сортировать() передавайте СравнениеЗначений.
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать("Дата,Ссылка", ОбъектСравнения);

Это особенно важно для таблиц на сотни и тысячи строк в алгоритмах, критичных ко времени выполнения.

3.1.

При поиске в Массив с большим количеством элементов лучше отказаться от массива в пользу:

  • Соответствие, если порядок элементов не важен;
  • индексированной ТаблицаЗначений, если порядок элементов значим.

В этих вариантах поиск обычно выполняется за константное время, а в массиве — перебором, то есть пропорционально числу элементов.

Ориентир по размеру — 1000 элементов и более. Также учитывайте число поисков. Если поиск выполняется многократно (например, в цикле), рекомендация актуальна и для меньших массивов. Особенно внимательно проверяйте универсальные механизмы, которые могут работать на больших объемах данных.

3.2.

Чтобы обеспечить уникальность элементов в большом массиве, однократно в конце алгоритма вызывайте СвернутьМассив() или ДополнитьМассив() с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения БСП).

4.

Аналогичный недостаток есть у ДеревоЗначений: индексов нет, поиск выполняется перебором. В описанных выше случаях заменяйте ДеревоЗначений на индексированную ТаблицаЗначений.

Источник

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