Skip to content

Метод Найти в таблице значений не использует индекс #1661

@Stivo182

Description

@Stivo182

Опишите ошибку
Метод Найти в таблице значений не использует индекс колонки. В результате поиск по индексированной колонке выполняется с той же скоростью, что и по неиндексированной. При этом метод НайтиСтроки корректно использует индекс и работает значительно быстрее.

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

Воспроизведение ошибки

  1. Установить и запустить бенчмарк
opm install benchmark
benchos run ./БенчмаркПоискаВТЗ.os

БенчмаркПоискаВТЗ.os

&Параметры(100000)
Перем Размер Экспорт;

Перем Таблица;
Перем ИскомыйКлюч;

&ИсполняющаяСреда("stable")
//&ИсполняющаяСреда("lts")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

&ПередКаждым
Процедура ПодготовитьДанные(Контекст) Экспорт

	Таблица = Новый ТаблицаЗначений();
	Таблица.Колонки.Добавить("СИндексом");
	Таблица.Колонки.Добавить("БезИндекса");

	Таблица.Индексы.Добавить("СИндексом");

	Для к = 0 По Размер - 1 Цикл

		Ключ = "Ключ" + Формат, "ЧГ=");

		Стр = Таблица.Добавить();
		Стр.СИндексом  = Ключ;
		Стр.БезИндекса = Ключ;

	КонецЦикла;

	ИскомыйКлюч = "Ключ" + Формат(Размер, "ЧГ=");

КонецПроцедуры

&Бенчмарк
&Эталон
&Категория("Найти")
Процедура ТаблицаНайтиПоИндексу() Экспорт
	Значение = Таблица.Найти(ИскомыйКлюч, "СИндексом");
КонецПроцедуры

&Бенчмарк
&Категория("Найти")
Процедура ТаблицаНайтиБезИндекса() Экспорт
	Значение = Таблица.Найти(ИскомыйКлюч, "БезИндекса");
КонецПроцедуры

&Бенчмарк
&Эталон
&Категория("НайтиСтроки")
Процедура ТаблицаНайтиСтрокиСИндексом() Экспорт
	Значение = Таблица.НайтиСтроки(Новый Структура("СИндексом", ИскомыйКлюч));
КонецПроцедуры

&Бенчмарк
&Категория("НайтиСтроки")
Процедура ТаблицаНайтиСтрокиБезИндекса() Экспорт
	Значение = Таблица.НайтиСтроки(Новый Структура("БезИндекса", ИскомыйКлюч));
КонецПроцедуры
  1. В отчете видим, что метод ТаблицаНайтиПоИндексу выполняется с той же скоростью, что и ТаблицаНайтиБезИндекса

Ожидаемое поведение

Метод Найти должен использовать индекс колонки при его наличии. В этом случае ТаблицаНайтиПоИндексу должен выполняться значительно быстрее ТаблицаНайтиБезИндекса и иметь сопоставимую производительность с ТаблицаНайтиСтрокиСИндексом.

Окружение

  • Версия: 2.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions