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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4431    dsdred    53    

70

Как готовить и есть массивы

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

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5271    YA_418728146    25    

62

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6389    dsdred    36    

111

1С-ная магия

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18463    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12073    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

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

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8799    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6271    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15959    SeiOkami    31    

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

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

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

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


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


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

Например:
Код
ТестТабл.Индексы.Добавить("Код, Значение");
ТестТабл.Индексы.Добавить("Значение, Код");
ТестТабл.Индексы.Добавить("Код, Наименование");
и т. п.
Показать полностью
daho; alsegor; RustIG; +3 Ответить
3. tormozit 7136 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 7136 19.05.09 12:11 Сейчас в теме
(4) Лучше изучайте документацию. Если ваш опыт говорит, что из А следует Б, это еще не значит что из А всегда следует Б. В неупорядоченных коллекциях не гарантирован порядок обхода элементов.
6. Anything 89 19.05.09 13:54 Сейчас в теме
(5) Я и делился опытом. Мой опыт показывает, что платформа реагирует именно так. Не зависимо от того, что написано в документации.
7. artbear 1448 19.05.09 19:03 Сейчас в теме
(5) А я почти согласен с (4), что "(3) Скорее, платформа не заморачивается с оптимальным порядком, а просто берет поля в порядке их описания."

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

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

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