![]() |
|
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) |"; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |