Совсем недавно пришлось столкнуться сразу с двумя задачами, где применялись таблицы значений.
Долго пытался решить одну из задач через запрос, но получалось не очень. В итоге вспомнил рекомендацию о том, что не нужно пытаться любым способом решить задачу через запрос. Обе задачи про распределение. Суть: нужно обойти строки таблицы значений и найти по отбору строки в другой таблице значений. Конечно я всегда применяю индексацию колонок таблицы значений при поиске, но тут решил посмотреть, а как же будет отличаться время, если колонки проиндексированы и если нет.
Пару вводных:
1️⃣ Две таблицы значений, в одной 66 тыс. строк, в другой 13 тыс. строк.
2️⃣ Селективность примерно 95%, то есть все строки почти уникальны.
3️⃣ Поиск ведется по двум колонкам через метод встроенного языка «НайтиСтроки».
Разница в скорости по индексированным колонкам таблицы значений и не проиндексированным почти в 48 раз. В первом случае, когда колонки проиндексированы общее время ~ около 1 секунды. Во втором случае почти 48 секунд. Взял среднее время нескольких итераций. Совершенно понятно, что на разном оборудовании это время может варьироваться, но главное тут порядок цифр.
Не пренебрегайте индексацией колонок таблицы значений, даже если считаете, что в таблице мало строк. Сейчас мало, но со временем вероятно будет больше, и индексация будет очень эффективна😉
Несколько напоминаний про индексы таблицы значений:
❗️При добавлении индекса, индекс создается составной. Например, если создать индекс по двум колонкам:
«ТаблицаЗначений.Индексы.Добавить(«Колонка1, Колонка2»)
а искать например только по одной колонке:
ТаблицаЗначений.Найти(Значение, «Колонка1»),
или так:
ТаблицаЗначений.НайтиСтроки(Новый Структура(«Колонка1", Значение1))
то такой индекс использоваться не будет.
❗️Поиск по одной колонке таблицы значений одинаково эффективен при поиске методами «Найти» и «НайтиСтроки», а вот если требуется поиск по нескольким колонкам сразу, то следует использовать только метод «НайтиСтроки».
Более подробно можно почитать в наших любимых стандартах тут.
>>Click here to continue<<
