Имя: Пароль:
1C
1C 7.7
v7: Как ускорить обработку? Какая функция работает быстрее?
0 sysadminlk
 
07.06.13
16:38
//ПОИСК УДАЛЕННЫХ ЭЛЕМЕНТОВ
   Сообщить("Поиск удаленных контрагентов...");
   ТекСписок = СоздатьОбъект("Справочник.DBF_VODA");
   ТекСписок.ВыбратьЭлементы();
   Поз=0;
   Пока ТекСписок.ПолучитьЭлемент() = 1 Цикл
       Поз=Поз+1;
       Состояние("Поиск удаленных: "+Поз+"");
       Если Виртуальный.НайтиЗначение(СокрЛП(ТекСписок.Наименование)) = 0 Тогда
           Ненайдены.НоваяСтрока();
           Ненайдены.Лиц = СокрЛП(ТекСписок.Наименование);
           Ненайдены.Фио = СокрЛП(ТекСписок.Фамилия);
       КонецЕсли;        
   КонецЦикла;

Виртуальный это СписокЗначений содержащий 197000 записей
ТекСписок содержит около 191000 элементов

Как быстрее все это обработать?
1 Mikeware
 
07.06.13
16:40
select...
2 НЕА123
 
07.06.13
16:41
(0)
запросом?
3 НЕА123
 
07.06.13
16:41
//        Состояние("Поиск удаленных: "+Поз+"");
4 Mikeware
 
07.06.13
16:42
(3) ага, процентов 15 отъест...
5 sysadminlk
 
07.06.13
16:46
запросы вообще не знаю
6 HeroShima
 
07.06.13
16:47
(5) и?
7 varelchik
 
07.06.13
16:49
Используй Вместо НайтиЗначение() Принадлежит() поидее должно быть быстрее.
а ще лучше в Списке иметь не наименования а сами элементы.
8 varelchik
 
07.06.13
16:50
а вообще ПрямойЗапрос тебе поможет.
9 Fragster
 
гуру
07.06.13
16:50
прямой запрос с условием "not in ()"
10 Boroda
 
07.06.13
16:54
SELECT
 Спр.Id [Вода  $Справочник.Справочник.DBF_VODA]
FROM $Справочник.DBF_VODA Спр
WHERE
  Спр.Descr NOT IN (SELECT Val FROM #СпВирт)


Запрос.УложитьСписокОбъектов(Вируальный, "#СпВирт")
11 Mikeware
 
07.06.13
16:55
(10) три раза подряд прочитал СпВирт как ВСпирт...
вот сижу и думаю, к чем бы это...
12 toypaul
 
гуру
07.06.13
16:58
для dbf будет быстрее пройтись по списку Виртуальный с поиском по наименованию
13 toypaul
 
гуру
07.06.13
16:59
для sql будет быстрее прямой запрос. если не умеешь, то как для dbf
14 ДенисЧ
 
07.06.13
16:59
(11) Пятница...
15 toypaul
 
гуру
07.06.13
17:00
хотя ... если по списку значений идти, то получится не то, что надо :)
16 vova1122
 
07.06.13
17:00
(0) А поместить Цикл в транзакцию (хотя-бы по 500 позиций). Не будет быстрее?
17 Mikeware
 
07.06.13
17:01
(14) дык не потребляю. да еще надо завтра выйти, сервера с админом немного помучить (точнее, чтоб он не чувствовал себя несправедливо заставленным)
18 sysadminlk
 
07.06.13
17:47
(7) огромное спасибо, сократил время
раньше с НайтиЗначение() вся обработка выполнялось 1068 секунд (17,8мин)
а с Принадлежит() выполняется 107 секунд (1,78мин)

107 секунд меня устраивает :)))))
19 Cthulhu
 
07.06.13
19:47
проскакивало где-то:
сравнение на <> работает быстрее чем сравнение на =
20 Ёпрст
 
гуру
07.06.13
20:13
(18) ждать 2 минуты ? Это п..ц дорогая редакция.
21 Zhuravlik
 
07.06.13
20:47
(0) Если база dbf, можно воспользоваться sqlite, как-то так:

   База = СоздатьОбъект("SQLiteBase");
   База.Открыть(":memory:");
   
   База.УложитьОбъекты(Виртуальный, "Виртуальный");
   
   Запрос = База.НовыйЗапрос();
   
   ТекстЗапроса = "
   |SELECT
   |    trim(спр.DESCR) as [Лиц],
   |    trim(спр.Фамилия) as [ФИО]
   |FROM
   |    [Справочник.DBF_VODA] as спр
   |WHERE
   |    NOT EXISTS (trim(спр.DESCR) IN (SELECT * FROM Виртуальный))
   |";
   
   тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
22 2S
 
07.06.13
20:50
транзакцию не предлагать?
23 Zhuravlik
 
07.06.13
20:53
(21) Даже так вроде:

   ТекстЗапроса = "
   |SELECT
   |    trim(Вирт.val) as [Лиц],
   |    trim(спр.Фамилия) as [ФИО]
   |FROM
   |    [Справочник.DBF_VODA] as спр
   |    inner join Виртуальный as Вирт on trim(спр.DESCR) = trim(Вирт.val)
   |";