Имя: Пароль:
1C
1C 7.7
v7: Как ускорить ""ТЗ.Свернуть("Раз,Два,Три","Четыре,Пять");""
0 Corvax46
 
10.12.12
17:04
Здравствуйте.
Есть метод "свернуть таблицу значений". Сама по себе ТЗ около 100к строк. И свертка идет чуть больше часа. Есть ли алгоритмы оптимизации сего процесса? По возможности без удаления "лишних" колонок из таблицы значений. Ну и подвопрос. Если кто проводил замеры, насколько ускоряется процесс после удаление части колонок (в процентах)?
1 Ёпрст
 
10.12.12
17:05
явно типизировать все колонки, сворачивать кусками по тысяче строк, к примеру
2 Азат
 
10.12.12
17:06
прямые дела не помогут?
3 Нуф-Нуф
 
10.12.12
17:06
попробуй запросом
4 Ёпрст
 
10.12.12
17:06
ну или свернуть в другом месте.. запросом, к примеру.
5 ДенисЧ
 
10.12.12
17:06
(3) Запросом? В 77?
6 exwill
 
10.12.12
17:06
(0) Больше часа? Вот для таких случаев и придумали язык запросов.
7 Ёпрст
 
10.12.12
17:07
(5) яя.. натюрлих!
8 Mikeware
 
10.12.12
17:12
Может, "что-то в консерватории поправить"©?
9 Pasha
 
10.12.12
17:15
(0) В транзакции попробуй
10 Ёпрст
 
10.12.12
17:17
(9) :))))))))))

какое отношение она имеет к свёртке ТЗ ?
11 Mikeware
 
10.12.12
17:19
(9) спасибо, повеселил! :-))))
12 Corvax46
 
10.12.12
17:19
Запросом интересная мысль. Немного сбивает с толку что в эту ТЗ собираются сводные данные. Образно:
Собрали поступления:
1 колонка: поставщик
2 колонка: товар
3 колонка: количество (значение положительное)

В ту же ТЗ собираем возвраты поставщикам:
1 колонка: поставщик
2 колонка: товар
3 колонка: количество (здесь значение отрицательное)

И теперь сворачиваем ТЗ("поставщик,товар","количество").
13 Corvax46
 
10.12.12
17:20
(+12) Получаем чистые поставки за минусом возврата поставщику.
14 exwill
 
10.12.12
17:23
(13) И в чем проблема?
15 Corvax46
 
10.12.12
17:24
(14) Очень стесняюсь.... Как в запросе сгруппировать?
16 Mikeware
 
10.12.12
17:25
(15) получай данные запросом. сразу. и в запросе вычитай
17 viktor_vv
 
10.12.12
17:31
(15) Как-то так. Откуда брешь данные ? Из докумнтов ?

|Поставщик = Документ.ПРиходнаяНакладная.Контрагент, Документ.ВозвратПоставщику.Контрагент ;
|КолПриход = Документ.ПРиходнаяНакладная.Количество;
|КолВозврат = Документ.ВозвратПоставщику.Количество;
|Функция ЧистыПриход = Сумма(КолПриход - КолВозврат) ;
|Группировка Поставщик ;
18 Corvax46
 
10.12.12
17:32
(16) Я так понимаю образно так:
|КвоПриход = Документ.ПоступлениеТоваров.Количество;
|КвоВозврат = Документ.ВозвратТоваровПоставщику.Количество;
|Группировка КвоПриход;
|Группировка КвоВозврат;
|Функция КвоИтого = Сумма(КвоПриход - КвоВозврат);

Нечто подобное?
19 exwill
 
10.12.12
17:33
(18) Группировка наверно по товару? не?
20 Mikeware
 
10.12.12
17:33
(19) и по поставщику..
21 Serginio1
 
10.12.12
17:34
(10) Есть. А сортирует она у тебя за сколько?
22 Mikeware
 
10.12.12
17:34
+(20) ну и товар нужно в запросе выдергивать тоже
23 mikecool
 
10.12.12
17:34
как запихнуть ТЗ в запрос? мой гений дарит вам (с) Геня

pRS = CreateObject("ODBCRecordset");
pRS.ВыполнитьИнструкцию("IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#VINRUDTable')) DROP TABLE tempdb..#VINRUDTable
|CREATE TABLE tempdb..#VINRUDTable (RUD char(15), VIN char(17), DeliveryDate char(8))");
pRS.ДобПараметр(1, 14, 15, 0);
pRS.ДобПараметр(1, 14, 17, 0);
pRS.ДобПараметр(1, 14, 10, 0);
pRS.Prepare("INSERT INTO tempdb..#VINRUDTable (RUD, VIN, DeliveryDate) VALUES(?, ?, ?)");
pRS.ВыполнитьSQL_ИзТЗ(ТемпТЗ, 0);

бла-бла

pRS.ВыполнитьИнструкцию("DROP TABLE tempdb.dbo.#VINRUDTable");

это так, вдруг кому пригодится )))
24 Corvax46
 
10.12.12
17:36
(21) Оч быстро. меньше минуты
25 Mikeware
 
10.12.12
17:36
(23) излишество.
зачем вытаскивать все в ТЗ, затем сливать все в базу - если можно извлечь готовые сгруппированные данные одним запросом?
26 Serginio1
 
10.12.12
17:36
А спамятьюу тебя что? Не может  100к записей группироваться за 1 час
27 mikecool
 
10.12.12
17:36
(25) не спорю, просто так приплел - вдруг кому пригодится
28 Corvax46
 
10.12.12
17:37
4 гига, w2k3 ентерпрайз.
1с-ка забирает около 700 мб
29 mikecool
 
10.12.12
17:38
+27 я этим пользовался при загрузке из екселя, считал данные в ТЗ, а потом выдернул по ним данные из базы
зы: 1с++
30 Mikeware
 
10.12.12
17:41
Я как-то давно делал экспорт их икзеля сразу в базу. недоделал, увидел готовое (вроде, ёпрст'шное)
31 Нуф-Нуф
 
10.12.12
17:42
1. создать базу на 8.2
2. в базе создать общий модуль, который читает цсв и грузит в ТЗ, выполняет к ней запрос, выгружает в ТЗ, сохраняет в цсв
3. в 7ке сохранять ТЗ в цсв
4. в семерке цепляться к 8.2 вызывать процедур
32 Нуф-Нуф
 
10.12.12
17:42
йоу
33 Serginio1
 
10.12.12
17:43
(28) А сортировка этой таблицы за сколько происходит?
Понятно, что лучше данные получить сгруппированные прямым запросом, а то 1С еще и группирует на клиенте. Попробовать разбиь тз на 10 тз свернуть, затем их объединить и свернуть окончательно.
34 ДенисЧ
 
10.12.12
17:43
Суровые челябинцы всегда решают задачи через...
Может, проще булком в скуль таблицу залить?
35 mikecool
 
10.12.12
17:45
(34) эх, были времена, когда база была на 2000 скуле, отдельно стоял 2005 через который я рисовал иерархическую структуру справочника )))
36 Serginio1
 
10.12.12
17:46
Вот есть такая обработка, но она делает типа Итоги в 1С
Можно не храненити ТзПоГруппе и получишь ту же группировку.
Единственоо сравнивать нужно с конца списка.

Функция СравнитьСписки(Сп1,сп2)
   Для сч=1 по Сп1.РазмерСписка() Цикл
              Если Сп1.ПолучитьЗначение(сч)<>Сп2.ПолучитьЗначение(сч) Тогда
                    Возврат 0
              КонецЕсли;
   КонецЦикла;  
       возврат 1
КонецФункции
   
   Функция глСгруппироватьПоПолямСТЗБыстр(Тз,Поля,Ресурсы) Экспорт
   перем Тип,Длина,Точность;                                                            
   
   
   Тз.Сортировать(Поля);
   ТзФ=СоздатьОбъект("ТаблицаЗначений");
   Сз=СоздатьОбъект("СписокЗначений");
   СписокИзмерений= ИзСтрокиСРазделителями(Сз,Поля,",");
   
   Для сч=1 по СписокИзмерений.РазмерСписка() Цикл            
       Поле=СписокИзмерений.ПолучитьЗначение(сч);
       Тз.ПолучитьПараметрыКолонки(поле,тип,Длина,Точность);    
       ТзФ.НоваяКолонка(поле,тип,длина,Точность);
   КонецЦикла;
   Сз=СоздатьОбъект("СписокЗначений");
   СписокРесурсов=ИзСтрокиСРазделителями(Сз,Ресурсы,",");  
   Для сч=1 по СписокРесурсов.РазмерСписка() Цикл            
       Поле=СписокРесурсов.ПолучитьЗначение(сч);
       Тз.ПолучитьПараметрыКолонки(поле,тип,Длина,Точность);    
       ТзФ.НоваяКолонка(поле,тип,длина,Точность);
   КонецЦикла;
   
   
   ТзФ.НоваяКолонка("ТзПоГруппе","ТаблицаЗначений");
   ТекСтр=0;
   
   Измерения=СоздатьОбъект("СписокЗначений");
   ТекИзмерения=СоздатьОбъект("СписокЗначений");
   Для сч=1 по СписокИзмерений.РазмерСписка() Цикл
       Измерения.ДобавитьЗначение("");
       ТекИзмерения.ДобавитьЗначение("");
   КонецЦикла;
     
   НачСтр=0;
   Если Тз.КоличествоСтрок()>0 Тогда
       
       Для сч=1 По Тз.КоличествоСтрок() Цикл
           Для счИзм=1 по СписокИзмерений.РазмерСписка() Цикл
               Поле=СписокИзмерений.ПолучитьЗначение(счизм);    
               ТекИзмерения.УстановитьЗначение(счИзм,Тз.ПолучитьЗначение(сч,Поле));
           КонецЦикла;
           
           
           Если (Сч=1) или ( СравнитьСписки(Измерения,ТекИзмерения)=0) Тогда
               Если НачСтр>0 Тогда
                   ТекТз=СоздатьОбъект("ТаблицаЗначений");
                   Тз.Выгрузить(ТекТз,НачСтр,сч-1);
                   Тзф.ТзПоГруппе=ТекТз;  
                   Для СчРес=1 по СписокРесурсов.РазмерСписка() Цикл            
                       Поле=СписокРесурсов.ПолучитьЗначение(СчРес);
                       Значение=ТекТз.Итог(Поле);
                       Тзф.УстановитьЗначение(ТекСтр,Поле,Значение);
                   КонецЦикла;
           КонецЕсли;
           
               ТзФ.НоваяСтрока();
               ТекСтр=Тзф.КоличествоСтрок();        
               Измерения.УдалитьВсе();
               ТекИзмерения.Выгрузить(Измерения);
               Для счизм=1 по СписокИзмерений.РазмерСписка() Цикл            
                   Поле=СписокИзмерений.ПолучитьЗначение(счизм);
                   Значение=Тз.ПолучитьЗначение(сч,Поле);
                   Тзф.УстановитьЗначение(ТекСтр,Поле,Значение);
               КонецЦикла;
               
               ТекТз=глКлонироватьСтруктуруТЗ(Тз);
               Тзф.ТзПоГруппе=ТекТз;
               НачСтр=Сч;
           КонецЕсли;    
           
       
       КонецЦикла;  
       
               Если НачСтр>0 Тогда
                   ТекТз=СоздатьОбъект("ТаблицаЗначений");
                   Тз.Выгрузить(ТекТз,НачСтр);
                   Тзф.ТзПоГруппе=ТекТз;  
                   Для СчРес=1 по СписокРесурсов.РазмерСписка() Цикл            
                       Поле=СписокРесурсов.ПолучитьЗначение(СчРес);
                       Значение=ТекТз.Итог(Поле);
                       Тзф.УстановитьЗначение(ТекСтр,Поле,Значение);
                   КонецЦикла;
           КонецЕсли;
   КонецЕсли;
   //    ТзФ.ВыбратьСтроку();
   Возврат ТзФ;
КонецФункции
37 viktor_vv
 
10.12.12
17:46
Я как-то делал через linked serverы из экселя
select
into
38 ДенисЧ
 
10.12.12
17:47
(35) А что 2005? А не оракл? :-)
39 viktor_vv
 
10.12.12
17:49
(37) к (29).
40 mikecool
 
10.12.12
17:49
(38) с оракулем я еще при установке не подружился )
как то помнится дома 8й на ХП поднял, а что за логин-пароль одмина - нигде ни слова, хорошо был знакомый, который подсказал, и то он потом не работал, службы падали постоянно ))
а вот 2005, да на сервере ставится в пол-тычка без особых знаний ))
41 Pasha
 
10.12.12
17:50
(10) В транзакции многие вещи происходят быстрее, чем без нее, вот и все отношение...
42 Ёпрст
 
10.12.12
17:50
(41) какая наивность
43 mikecool
 
10.12.12
17:51
(41) лишь бы эякуляция не была преждевременной ))))
44 Pasha
 
10.12.12
17:51
(43) страдаешь?
45 ДенисЧ
 
10.12.12
17:52
(40) Зато в оракле были и есть конструкции для дерева... :-)
46 mikecool
 
10.12.12
17:52
(43) без транзакции - нет, а вот в транзакции....
47 mikecool
 
10.12.12
17:52
(45) ну что тут сказать? ))) и так было плохо после оракла пересесть на мс скуль )))
48 igork1966
 
10.12.12
17:55
(44) просто твой пост показывает полное непонимание процесса... вот тебя и подкалывают
49 Cthulhu
 
10.12.12
17:56
1склайтом - уложить и запросить. прям в мозгах.
50 Cthulhu
 
10.12.12
17:56
(49)+: и в пару-тройку строк.
51 Corvax46
 
10.12.12
18:01
(49) Если не сложно, можно пример?
52 Serginio1
 
10.12.12
18:08
Процедура УложитьТаблицу(рс,ИБ,пТЗ, ИмяТаб, Колонки="") Экспорт
   Перем ТЗ;

   Если ПустаяСтрока(Колонки)=1 Тогда
       ТЗ=пТЗ;
   Иначе
       пТЗ.Выгрузить(ТЗ,,,Колонки);
   КонецЕсли;
   СтрCreate="create table %Имя% (/*column_definition*/)";
   СтрInsert="insert into %Имя% values(/*?*/)";
   Тип="";
   Длина="";
   Точность="";
   ФорматнаяСтрока="";
   КолонкиЕсть=0;
   Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
       Идентификатор=ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,ФорматнаяСтрока);
       Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
           Продолжить;
       КонецЕсли;
       КолонкиЕсть=1;
       Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда
           SQL_тип=ФорматнаяСтрока;
           рс.ДобПараметр(1,);
       ИначеЕсли ПустаяСтрока(Тип)=1 Тогда
           SQL_тип="char(9)";
           рс.ДобПараметр(1,14,9,0);
       ИначеЕсли Тип="Число" Тогда
           Если Длина=0 Тогда
               Длина=38;
               Точность=10;
           КонецЕсли;
           SQL_тип="numeric(%p%,%s%)";
           SQL_тип=СтрЗаменить(SQL_тип,"%p%",Длина);
           SQL_тип=СтрЗаменить(SQL_тип,"%s%",Точность);
           рс.ДобПараметр(1,11,Длина,Точность);
       ИначеЕсли Тип="Строка" Тогда
           Если Длина=0 Тогда
               SQL_тип="varchar(%n%)";
               SQL_тип=СтрЗаменить(SQL_тип,"%n%",255);
               рс.ДобПараметр(1,15,255,0);
           Иначе
               SQL_тип="char(%n%)";
               SQL_тип=СтрЗаменить(SQL_тип,"%n%",Длина);
               рс.ДобПараметр(1,14,Длина,0);
           КонецЕсли;
       ИначеЕсли Тип="Дата" Тогда
           SQL_тип="datetime";
           рс.ДобПараметр(1,8,0,0);
       ИначеЕсли Найти(Тип,".")>0 Тогда
           SQL_тип="char(9)";
           рс.ДобПараметр(1,14,9,0);
       Иначе
           SQL_тип="char(13)";
           рс.ДобПараметр(1,14,13,0);
   //        ТЗ.УстановитьПараметрыКолонки(Идентификатор,,,,"?2");
       КонецЕсли;
       СтрCreate=СтрЗаменить(СтрCreate,"/*,*/",", ");
       СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*//*column_definition*/");
       СтрInsert=СтрЗаменить(СтрInsert,"/*,*/",", ");
       СтрInsert=СтрЗаменить(СтрInsert,"/*?*/","?/*,*//*?*/");
   КонецЦикла;
   Если КолонкиЕсть=1 Тогда
       ТекстЗапроса="
       |set nocount on
       |if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 )
       |  drop table %Имя%;
       |"+СтрCreate+"
       |set nocount off
       |";
       рс_=СоздатьОбъект("ODBCRecordset");
       рс_.УстБД(ИБ);
       рс_.ВыполнитьИнструкцию(СтрЗаменить(ТекстЗапроса,"%Имя%",ИмяТаб));
       рс.Подготовить(СтрЗаменить(СтрInsert,"%Имя%",ИмяТаб));
       рс.ВыполнитьSQL_ИзТЗ(ТЗ,100);
   КонецЕсли;
КонецПроцедуры
53 Voronve
 
10.12.12
18:26
(0) 100к строк ? .Свернуть > часа ? оО Не верю (с)
Параметры железа в студию
54 Pasha
 
10.12.12
18:31
(48) Метод НачатьТранзакцию() иногда помогает ускорить обработку больших массивов данных, так как работа полностью идет в оперативной памяти...
Может тут и не тот случай, потому и написал "попробуй"...
Но хамства это не оправдывает...
55 viktor_vv
 
10.12.12
18:34
(54) Пожалуй сейчас очередная порция будет :).
56 Pasha
 
10.12.12
18:39
(55) Лично со своими помошниками занимался сверткой УТ огроменной... Сократили время с 10 часов до 3... Дробили ТЗ, еще кучу всего..в том числе и транзакции
57 Рэйв
 
10.12.12
18:41
(56)ТЗ  если что и так в памяти крутится. Обращения к базе нет. Не неси бред и смущение в массы:-)
58 viktor_vv
 
10.12.12
18:43
(56) Так при свертке запись в базу дробишь на мелкие транзакции, это понятно с ускорением.

Каким боком транзакция к свертке таблицы значений ?
59 viktor_vv
 
10.12.12
18:44
(58)* При свертке базы.
60 IOL
 
10.12.12
18:45
А не кто не предложил сразу делать дерево итогов в другой ТЗ. т.е. добавлять строки в одну таблицу(детали), в другую тз (итоги), т.е. тупо найти строку с ключом и добавить в нее итог?
61 Рэйв
 
10.12.12
18:46
(60)Тебе рассказать про соединения в запросах?:-)
62 Рэйв
 
10.12.12
18:47
хот тут v7 вродет..С этим сложнее.
63 IOL
 
10.12.12
18:47
(61) Причем тут они, он наборку ТЗ делает, почему бы сразу параллельно и итоги не считать?
64 Pasha
 
10.12.12
18:48
(57) Ты вообще ничего не предложил... Так что не интересен
65 Рэйв
 
10.12.12
18:48
(63) Итоги в тз - напржна вещь. Если общие, то нет проблем.Но если по срезам - то гемор еще тот.
66 IOL
 
10.12.12
18:49
(65) Блин, да просто делается.

Ключ1+ключ2+ключ3 Итого1, Итог2
67 Рэйв
 
10.12.12
18:50
(64)А чего тут предлагать? Есть внутренний механизм. Худо - бедно работает.
Хочешь улучшить? - Валяй,флаг в руки, пиши ВК на асме. :-)

Но только не надо тут про транзакции , убыстряющие работу с ТЗ:-))
68 Рэйв
 
10.12.12
18:51
(66)Несколько сверток. Потом несколько поисков...Не не оптимально.
69 Mikeware
 
10.12.12
18:52
(65) ты их просто готовить не умеешь..
70 Рэйв
 
10.12.12
18:52
(69)Да умею...но все равно писанины...
71 Mikeware
 
10.12.12
18:53
(67) "все давно украдено до вас."©
объект ИндексированнаяТаблица вполне себе рулит.
я уж не говорю, что в данной задаче и она нафиг не нужна = все прекрасно достается и группируется запросом.
72 Garykom
 
гуру
10.12.12
18:54
У него наверно вместо элементов справочников в ячейки строки засунуты.
Т.е. вместо поставщика, товара и т.д. строка с именем поставщика или товара
73 Mikeware
 
10.12.12
18:54
(54) и где ты видишь хамство?
74 IOL
 
10.12.12
18:55
(68) Таблица итогов, в разы меньше чем, таблица деталей, значит и поиск по ней будет быстрее.
75 Mikeware
 
10.12.12
18:55
(72) лехко.
хотя при запихиании строк в ТЗ при таких объемах все бы упало еще на этапе заполнения ТЗ
76 Рэйв
 
10.12.12
18:56
(71)Ну я с самого начала говорил про запрос
77 viktor_vv
 
10.12.12
18:56
(70) До индексированной таблицы пользовался вот этим. Вполне.  И быстро.

http://infostart.ru/public/14140/
78 IOL
 
10.12.12
18:57
(74) А если вообще прямым запросом все выгребается, то через временные таблицы, и вообще париться не надо.
79 Mikeware
 
10.12.12
18:57
(77) да вариантов - куча...
80 Рэйв
 
10.12.12
18:59
(77)Спасибо, посмотрю.
81 ADirks
 
10.12.12
19:32
(54) мне иногда помогает:
- выпить вотки
- выпить пива (побольше)
- поспать
- сходить в отпуск
- погонять на велосипеде
- почитать умные книжки
- потрындеть с коллегами (не на форуме)
- послать всех подальше

Считаю, что ТС обязательно должен всё это попробовать!
82 Рэйв
 
10.12.12
19:39
(81)Да он на вотке сломается и побежит кодить....
83 Cthulhu
 
10.12.12
20:37
(51): дапжалст.

ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); _1склБаза=СоздатьОбъект("SQLiteBase"); _1склБаза.Открыть(":memory:");
_1склБаза.УложитьТЗ(ИсхТЗ,"ДляСвертки"); тМилиСек=_GetPerformanceCounter(); СверткаТЗ=_1склБаза.НовыйЗапрос().ВыполнитьЗапрос("
|SELECT ДоСвертки.Контрагент [Контрагент :Справочник.Контрагенты], ДоСвертки.Тмц [Тмц :Справочник.ТМЦ], Sum(ДоСвертки.Кво) Кво
|FROM ДляСвертки as ДоСвертки GROUP BY ДоСвертки.Контрагент, ДоСвертки.Тмц"); тМилиСек=_GetPerformanceCounter()-тМилиСек;
Сообщить(ТекДатаВремяПрефикс()+"Свертка 1sqlite-запросом: милиСекунд = "+СокрЛП(Формат(тМилиСек/1000,"Ч19.3, ")),"i");
Сообщить(СимволТабуляции+"Исходная ТЗ: строк = "+ИсхТЗ.КоличествоСтрок()+" / Ит.К-во = "+ИсхТЗ.Итог("Кво"),".");
Сообщить(СимволТабуляции+"Свернутая ТЗ: строк = "+СверткаТЗ.КоличествоСтрок()+" / Ит.К-во = "+СверткаТЗ.Итог("Кво"),".");

------- Результаты:
<10.12.2012/18:36:43/МилиСек=70934055>: Выгрузка ТЗ в таблицу 1sqlite: милиСекунд = 0,736
<10.12.2012/18:36:46/МилиСек=70936695>: Свертка 1sqlite-запросом: милиСекунд = 1,902
   Исходная ТЗ: строк = 200000 / Ит.К-во = 200000
   Свернутая ТЗ: строк = 252 / Ит.К-во = 200000
84 Cthulhu
 
10.12.12
20:37
в (83) в сообщениях - конечно же секунды...
85 Cthulhu
 
10.12.12
20:49
(83)+(84): криво и наскоро. вот пашущий код и тест на 500 000 строк:

ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); _1склБаза=СоздатьОбъект("SQLiteBase"); _1склБаза.Открыть(":memory:");
_1склБаза.УложитьТЗ(ИсхТЗ,"ДляСвертки"); тМилиСек=_GetPerformanceCounter();
_1склБаза.УложитьТЗ(ИсхТЗ,"ДляСвертки"); тМилиСек=_GetPerformanceCounter()-тМилиСек;
Сообщить(ТекДатаВремяПрефикс()+"Выгрузка ТЗ в таблицу 1sqlite: Секунд = "+СокрЛП(Формат(тМилиСек/1000,"Ч19.3, ")),"i");
тМилиСек=_GetPerformanceCounter(); СверткаТЗ=_1склБаза.НовыйЗапрос().ВыполнитьЗапрос("
|SELECT ДоСвертки.Контрагент [Контрагент :Справочник.Контрагенты], ДоСвертки.Тмц [Тмц :Справочник.ТМЦ], Sum(ДоСвертки.Кво) Кво
|FROM ДляСвертки as ДоСвертки GROUP BY ДоСвертки.Контрагент, ДоСвертки.Тмц"); тМилиСек=_GetPerformanceCounter()-тМилиСек;
Сообщить(ТекДатаВремяПрефикс()+"Свертка 1sqlite-запросом: Секунд = "+СокрЛП(Формат(тМилиСек/1000,"Ч19.3, ")),"i");
Сообщить(СимволТабуляции+"Исходная ТЗ: строк = "+ИсхТЗ.КоличествоСтрок()+" / Ит.К-во = "+ИсхТЗ.Итог("Кво"),".");
Сообщить(СимволТабуляции+"Свернутая ТЗ: строк = "+СверткаТЗ.КоличествоСтрок()+" / Ит.К-во = "+СверткаТЗ.Итог("Кво"),".");

<10.12.2012/18:49:28/МилиСек=71699029>: Выгрузка ТЗ в таблицу 1sqlite: Секунд = 2,584
<10.12.2012/18:49:34/МилиСек=71704375>: Свертка 1sqlite-запросом: Секунд = 5,344
  Исходная ТЗ: строк = 500000 / Ит.К-во = 500000
  Свернутая ТЗ: строк = 252 / Ит.К-во = 500000
86 Cthulhu
 
10.12.12
21:55
хотя.. тесты показывают, что очень сомнительно.
<10.12.2012/19:54:34/МилиСек=75604378>: Выгрузка ТЗ в таблицу 1sqlite: милиСекунд = 3,923
<10.12.2012/19:54:45/МилиСек=75615543>: Свертка 1sqlite-запросом: милиСекунд = 11,164
- Исходная ТЗ: строк = 999999 / Ит.К-во = 999999
- Свернутая ТЗ: строк = 252 / Ит.К-во = 999999
<10.12.2012/19:54:55/МилиСек=75625414>: Стандарт-свертка ТЗ: Секунд = 9,685
- Стандарт-свертка ТЗ: строк = 252 / Ит.К-во = 999999
87 Corvax46
 
13.12.12
12:29
(53)
-Кор 3 550
-4 гиг
-W2k3 энтерпрайз x86
AdBlock убивает бесплатный контент. 1Сергей