1с++ Индексированная таблица скорость индексации

Автор Andrewalexk, 23 октября 2026, 12:42

« назад - далее »

Andrewalexk

:)
всем привет
наткнулся на странный имхо тайминг зависимости минут/строк таблицы
1. файловая версия 1с77 (win10)
6193
12:23:36+индекс
12:24:05=индекс
50561
12:26:02+индекс
12:30:09=индекс
102855
12:32:33+индекс
12:40:47=индекс
2. терминальная версия 1с77 (microsoft rdp)
6196
12:33:37+индекс
12:33:40=индекс
50562
12:34:55+индекс
12:35:25=индекс
331186
12:37:08+индекс
12:40:43=индекс
это нормально?

Ветер в поле

Судя по всему вы используете индекс по справочникам без сортировки с указанием *, поэтому сортировка у вас не по внутренним идентификаторам, а по представлению. Если нет необходимости в сортировке по представлению, то лучше отказаться от использования "Контрагент", а писать "*Контрагент". Если же нужна сортировка, то желательно в таблицу еще при ее формировании добавлять поле для сортировки, чтобы при индексировании не приходилось постоянно лезть в базу за представлением.
Сами цифры абсолютно нормальные и говорят, что эффективность индексирования высокая и имеет линейную зависимость от количества строк. Если индекс строится по атомарным значениям (строки, числа, внутреннее представление объектов), то скорость должна быть примерно на порядок выше. Простой индекс на сотнях тысяч строк строится считанные секунды.

Немного поэкспериментировал и получились вот такие цифры:

Индекс * по 6000 строкам = 0.002 с.
Индекс без * по 6000 строкам = 0.528 с.
Индекс * по 50000 строкам = 0.024 с.
Индекс без * по 50000 строкам = 10.205 с.
Индекс * по 100000 строкам = 0.052 с.
Индекс без * по 100000 строкам = 24.49 с.

Харлампий Дымба

Если же вопрос про разницу в скорости между файловым и терминальным режимом работы, то это вроде как общеизвестный факт. Сброс локального кэширования в файловой версии даёт сильное падение. SMB1 (во времена которой 7.7 писалась) под Win10 отключили (из-за всяких WannaCry), а современный SMB3 оптимизирован под передачу больших файлов, в то время как 7.7 делает кучу мелких сетевых запросов - и получаются ещё большие торомоза.
На файловой - только ларьки на 1-2 компьютера. Всё остальное - в терминале, при необходимости - ещё и в SQL.

Ветер в поле

Если же не хочется уходить от сетевой версии, то для нее есть расширение Вирт:V7DBNet - отлично работает на небольших сетях. У меня несколько лет у 10 пользователей работало и никаких проблем не было. Скорость, конечно, поменьше, чем у терминала, но в разы выше, чем у стандартной сетевой. Раньше больше 3-х пользователей было платно, но сейчас это совершенно бесплатная разработка. Причем она убирает многие проблемы сетевой. Самое главное, что файлы базы не надо размещать в сетевом доступе. В общем, рекомендую!


Andrewalexk

:)
быстрее
но теперь разность не але

итз1.загрузить(тз1); 
итз1.ДобавитьИндекс("Пациент","*"+"Пациент");       
сообщить(текущеевремя()+" "+итз1.Количествострок());
итз2.загрузить(тз2); 
итз2.ДобавитьИндекс("Пациент","*"+"Пациент");       
сообщить(текущеевремя()+" "+итз2.Количествострок()+"("+НомерПериода+")");
итз2.Разность(итз1,"Пациент","Пациент",0);
сообщить(текущеевремя()+" "+итз1.Количествострок()+"-"+итз2.Количествострок());

11:30:27 73633
11:30:27 247818
11:30:28 73633-247818


Ветер в поле

Я вот так время засекаю:
НачВремя = _GetPerformanceCounter();
	
итПац.ДобавитьИндекс("Элем", "*ТекущийЭлемент", 0);
	
Сообщить("Индекс * по " + ВыбКолвоСтрок + " строкам = "+(_GetPerformanceCounter()-НачВремя)/1000 + " с.");

Тогда точность до миллисекунды.