Размышления и изыскания по использованию индексов ТЗ

21.04.09

Разработка - Механизмы платформы 1С

Размышления и изыскания по использованию индексов ТЗ

Не статья, так - заметка. 
В ходе решения задачи по сохранению ссылок объектов БД в виде числа DWORD возникла мысль использовать регистр для хранения кода DWORD и ссылки на объект. 
Было решено протестировать скорость выборки на примере таблицы значений.
Для выборки использовалась новая фича 1С - индексы таблицы значений.

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

Диагностические сообщения при использовании индекса ТЗ (поиск 5000 и 50 значений):

    Время создания таблицы из 1 000 000 без создания индекса составило: 13 016 мсек
    Создание индекса для 1 000 000 записей составило 7 265 мсек
    Поиск в индексированной ТЗ 5 000 записей занял 63 мсек. Найдено 47 совпадений из 5 000 значений

    Время создания таблицы из 1 000 000 без создания индекса составило: 12 797 мсек
    Создание индекса для 1 000 000 записей составило 7 250 мсек
    Поиск в индексированной ТЗ 50 записей занял 0 мсек. Найдено 0 совпадений из 50 значений



И без индекса (поиск 5000 и 50 значений):

    Время создания таблицы из 1 000 000 без создания индекса составило: 13 063 мсек
    Поиск в НЕ индексированной ТЗ 5 000 записей занял 595 859 мсек. Найдено 47 совпадений из 5 000 значений

    Время создания таблицы из 1 000 000 без создания индекса составило: 12 907 мсек
    Поиск в НЕ индексированной ТЗ 50 записей занял 5 984 мсек. Найдено 0 совпадений из 50 значений


Вывод одназначен - при использовании выборок из временных таблиц значений стоит использовать индексы.
Код для Интегратора для проверки

 

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
  Скрипт.language = "javascript";
  
  ЧислоЗаписей = 1000000;
  ЧислоИтерацийПоиска = 50;
  
  ОчиститьСообщения();
  Сообщить("Идет создание м наполнение таблицы значений");
  
  ВремяСтарта = Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"));
  
  ТестТабл = Новый ТаблицаЗначений;
  ТестТабл.Колонки.Добавить("Код");
  ТестТабл.Колонки.Добавить("Значение");
  
  Для Сч = 1 По ЧислоЗаписей Цикл
     СтрокаТЗ = ТестТабл.Добавить();
     СтрокаТЗ.Код = Сч;
     СтрокаТЗ.Значение = Строка(Новый УникальныйИдентификатор());
  КонецЦикла;      
  
  Сообщить("Время создания таблицы из "+Строка(ЧислоЗаписей)+" без создания индекса составило: "+
          Строка(Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"))-ВремяСтарта)+" мсек");
        
  // создание индекса        
  ВремяСтарта = Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"));
  ТестТабл.Индексы.Добавить("Код");
  Сообщить("Создание индекса для "+Строка(ЧислоЗаписей)+" записей составило "+
       Строка(Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"))-ВремяСтарта)+" мсек");
     
 // поиск в таблице
 ГСЧ = Новый ГенераторСлучайныхЧисел(ЧислоЗаписей);
 
 ВремяСтарта = Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"));
 
 ЧислоСовпадений = 0;
 Для Сч = 1 по ЧислоИтерацийПоиска Цикл
     КодПоиска = ГСЧ.СлучайноеЧисло(0,ЧислоЗаписей*100);
     СтрокаТЧ = ТестТабл.Найти(КодПоиска,"Код"); 
     Если СтрокаТЧ <> Неопределено тогда
         ЧислоСовпадений = ЧислоСовпадений+1;
     КонецЕсли;     
 КонецЦикла; 
 
 Сообщить("Поиск в НЕ индексированной ТЗ "+Строка(ЧислоИтерацийПоиска)+" записей занял "+
       Строка(Число(Формат(Скрипт.Eval("new Date().getTime()"),"ЧГ=0"))-ВремяСтарта)+" мсек. "+
     "Найдено "+ Строка(ЧислоСовпадений) + " совпадений из " + Строка(ЧислоИтерацийПоиска)+" значений");     



Предложения по поводу хранения ссылок на объект в DWORD приветствуются.
2009-04-21 kadr

См. также

Динамическое обновление - это зло?

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    27413    Infostart    83    

243

Совместимость работы со строками. Жизнь до 8.3.6 и после

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Немного о совместимости со старыми версиям платформы 1С в работе со строками.

21.02.2020    8401    Infostart    25    

69

Эволюция расширения конфигурации

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

С каждым днем всё больше возможностей появляется в расширении конфигурации, но не все до сих пор работают даже на платформе 8.3.6! Давайте окунемся в историю появления и эволюции расширения конфигурации, чтобы знать и понимать, когда можно применить тот или иной функционал!

06.02.2020    26774    Xershi    51    

223

Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"

Механизмы платформы 1С Управляемые формы Бесплатно (free)

Переход на управляемые формы перевернул процесс разработки на 1С, заставив программистов менять привычные подходы к описанию логики работы интерфейса. Руководитель компании «Цифровой Кот» Юрий Лазаренко в своем докладе на конференции Infostart Event 2019 Inception рассказал о том, как устроены управляемые формы и как правильно работать с тонким клиентом платформы 1С:Предприятие.

23.12.2019    25143    TitanLuchs    23    

100

30 задач. Странных и не очень

Математика и алгоритмы Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    50764    Infostart    65    

164

Фишечки-рюшечки

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

06.11.2019    11204    mpeg1989    95    

66

ЧтениеДанных и ЗаписьДанных. Работа со строками

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Использование потоков и двоичных данных для работы со строками.

04.10.2019    23851    Yashazz    16    

76
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Anything 89 22.04.09 09:57 Сейчас в теме
Согласен. Использование индексов для ТЗ ускоряет поиск на порядок.

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

Например, если мы ищем строки так:
Код
Отбор = Новый Структура;
Отбор.Добавить("Значение", ЗначениеПоиска);
Отбор.Добавить("Код", КодПоиска);

НайденныеСтроки = ТестТабл.НайтиСтроки(Отбор);
Показать полностью


То и индекс надо создавать соответствующим образом:
Код
ТестТабл.Индексы.Добавить("Значение, Код");
Показать полностью


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

Например:
Код
ТестТабл.Индексы.Добавить("Код, Значение");
ТестТабл.Индексы.Добавить("Значение, Код");
ТестТабл.Индексы.Добавить("Код, Наименование");
и т. п.
Показать полностью
daho; alsegor; RustIG; +3
3. tormozit 7140 18.05.09 23:10 Сейчас в теме
(1) Вы неправы. Структура не является упорядоченной коллекцией. Скорее при поиске платформа сама переставляет поля, подбирая оптимальный порядок.
markers; RustIG; +2
4. Anything 89 19.05.09 11:59 Сейчас в теме
(3) Скорее, платформа не заморачивается с оптимальным порядком, а просто берет поля в порядке их описания.

А насчет упорядоченности структуры - есть такой оператор: "Для Каждого ... Из ...".

Проверьте результат двух вариантов:

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


2.
Код
Структура = Новый Структура("Поле2, Поле1");
Для Каждого Элемент Из Структура Цикл
   Сообщить(Элемент.Ключ);
КонецЦикла;
Показать полностью
+
5. tormozit 7140 19.05.09 12:11 Сейчас в теме
(4) Лучше изучайте документацию. Если ваш опыт говорит, что из А следует Б, это еще не значит что из А всегда следует Б. В неупорядоченных коллекциях не гарантирован порядок обхода элементов.
+
6. Anything 89 19.05.09 13:54 Сейчас в теме
(5) Я и делился опытом. Мой опыт показывает, что платформа реагирует именно так. Не зависимо от того, что написано в документации.
+
7. artbear 1522 19.05.09 19:03 Сейчас в теме
(5) А я почти согласен с (4), что "(3) Скорее, платформа не заморачивается с оптимальным порядком, а просто берет поля в порядке их описания."

По многолетнему опыту работы с 1С (77 и 8) и разработке ВК 1С++/ФормЕкс на базе внутренностей 1С знаю, что общие объекты типа СЗ, ТЗ, Структуры и т.д. 1С практически не оптимизирует :(

ЗЫ хотя, конечно, только точное тестирование может показать истину.
Пример с циклом "для каждого" может быть и не характерен :)
+
2. YAN 1373 22.04.09 10:17 Сейчас в теме
Очень полезно использовать индексы, правда надо не забывать после дописать следующий код:

ТестТабл.Индексы.Очистить();
+
8. tormozit 7140 19.05.09 19:13 Сейчас в теме
Зачем строить предположения, если разработчики платформы давали уже не раз четкие разъяснения по этому вопросу? При выполнении поиска в ТЗ по отбору в виде структуры выполняется подбор индекса по простому алгоритму: перебираем элементы структуры и вычеркиваем индексы, которые не подходят; из оставшихся вычеркиваем, имеющие лишние элементы.
markers; RustIG; +2
9. artbear 1522 28.01.10 17:55 Сейчас в теме
Ну т.е. в (8) цитатой "перебираем элементы структуры" подтверждено (4) и (7)
т.к. перебор идет просто в порядке описания.
+
Оставьте свое сообщение