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