Опишите ошибку
Метод Найти в таблице значений не использует индекс колонки. В результате поиск по индексированной колонке выполняется с той же скоростью, что и по неиндексированной. При этом метод НайтиСтроки корректно использует индекс и работает значительно быстрее.
BenchmarkOneScript v0.7.0, OneScript v2.0.0, Microsoft Windows NT 10.0.20348.0
Intel Core i7-8700 CPU 3.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
| Method |
Categories |
Размер |
Baseline |
Mean |
Ratio |
| ТаблицаНайтиПоИндексу |
Найти |
100,000 |
Yes |
7,734.763 us |
1.00 |
| ТаблицаНайтиБезИндекса |
Найти |
100,000 |
No |
7,260.710 us |
0.94 |
| ТаблицаНайтиСтрокиСИндексом |
НайтиСтроки |
100,000 |
Yes |
4.482 us |
1.00 |
| ТаблицаНайтиСтрокиБезИндекса |
НайтиСтроки |
100,000 |
No |
16,016.251 us |
3,574.75 |
Воспроизведение ошибки
- Установить и запустить бенчмарк
benchos run ./БенчмаркПоискаВТЗ.os
БенчмаркПоискаВТЗ.os
&Параметры(100000)
Перем Размер Экспорт;
Перем Таблица;
Перем ИскомыйКлюч;
&ИсполняющаяСреда("stable")
//&ИсполняющаяСреда("lts")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
&ПередКаждым
Процедура ПодготовитьДанные(Контекст) Экспорт
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("СИндексом");
Таблица.Колонки.Добавить("БезИндекса");
Таблица.Индексы.Добавить("СИндексом");
Для к = 0 По Размер - 1 Цикл
Ключ = "Ключ" + Формат(к, "ЧГ=");
Стр = Таблица.Добавить();
Стр.СИндексом = Ключ;
Стр.БезИндекса = Ключ;
КонецЦикла;
ИскомыйКлюч = "Ключ" + Формат(Размер, "ЧГ=");
КонецПроцедуры
&Бенчмарк
&Эталон
&Категория("Найти")
Процедура ТаблицаНайтиПоИндексу() Экспорт
Значение = Таблица.Найти(ИскомыйКлюч, "СИндексом");
КонецПроцедуры
&Бенчмарк
&Категория("Найти")
Процедура ТаблицаНайтиБезИндекса() Экспорт
Значение = Таблица.Найти(ИскомыйКлюч, "БезИндекса");
КонецПроцедуры
&Бенчмарк
&Эталон
&Категория("НайтиСтроки")
Процедура ТаблицаНайтиСтрокиСИндексом() Экспорт
Значение = Таблица.НайтиСтроки(Новый Структура("СИндексом", ИскомыйКлюч));
КонецПроцедуры
&Бенчмарк
&Категория("НайтиСтроки")
Процедура ТаблицаНайтиСтрокиБезИндекса() Экспорт
Значение = Таблица.НайтиСтроки(Новый Структура("БезИндекса", ИскомыйКлюч));
КонецПроцедуры
- В отчете видим, что метод
ТаблицаНайтиПоИндексу выполняется с той же скоростью, что и ТаблицаНайтиБезИндекса
Ожидаемое поведение
Метод Найти должен использовать индекс колонки при его наличии. В этом случае ТаблицаНайтиПоИндексу должен выполняться значительно быстрее ТаблицаНайтиБезИндекса и иметь сопоставимую производительность с ТаблицаНайтиСтрокиСИндексом.
Окружение
Опишите ошибку
Метод
Найтив таблице значений не использует индекс колонки. В результате поиск по индексированной колонке выполняется с той же скоростью, что и по неиндексированной. При этом методНайтиСтрокикорректно использует индекс и работает значительно быстрее.Воспроизведение ошибки
БенчмаркПоискаВТЗ.os
ТаблицаНайтиПоИндексувыполняется с той же скоростью, что иТаблицаНайтиБезИндексаОжидаемое поведение
Метод
Найтидолжен использовать индекс колонки при его наличии. В этом случаеТаблицаНайтиПоИндексудолжен выполняться значительно быстрееТаблицаНайтиБезИндексаи иметь сопоставимую производительность сТаблицаНайтиСтрокиСИндексом.Окружение