Каталог решений - Размышления и изыскания по использованию индексов ТЗ

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

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

В наличии

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

Категория:

Описание

Не статья, так — заметка. 
В ходе решения задачи по сохранению ссылок объектов БД в виде числа 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

has been added to your cart:
Оформление заказа