Имя: Пароль:
1C
1C 7.7
v7: Как ускорить запрос
0 vsy
 
30.04.21
11:01
Есть задача из 1с 7.7 в таблице дбф изменить значение колонки у всех записей. Делаю запрос через oledb с помощью foxpro. Запрос отрабатывет но очень долго, при 150000 записей отрабатывет 1,5 часа. Просто ужас, а если бы было 10000000. Попробовал через ADO такая же фигня. Причем через ADO при указании курсора на сервере вылазит ошибка.
Запрос по ole:
oledb = СоздатьОбъект("OLEDBData");
СтрокаСоединения =("Provider=VFPOLEDB.1;Deleted=-1;Null = Yes;Exclusive = No;SourceType = DBF;Data Source="+База+";Mode=ReadWrite;Extended Properties="""";User ID="""";Password="""";Mask Password=False;Collating Sequence=MACHINE;DSN=""""");
oledb.Connect(СтрокаСоединения);
Запрос = oledb.СоздатьКоманду();
ТекстЗапроса="UPDATE KL SET II = :счетчик WHERE II=:ид";
для с=1 по тз.количествострок() цикл
    ид=тз.ПолучитьЗначение(с,"II");
    Запрос.УстановитьТекстовыйПараметр("счетчик", с);
    Запрос.УстановитьТекстовыйПараметр("ид", ид);
    Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЦикла;
Запрос.закрыть();
для ADO:
ОлеДБ = СоздатьОбъект("ADODB.Connection");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + База + ";Mode=ReadWrite;Collating Sequence=MACHINE";
ОлеДБ.Open(Соединение);
ТекстЗапроса = "select * from KL";
RecordSet = СоздатьОбъект("ADODB.RecordSet");
RecordSet.ActiveConnection = ОлеДБ;
RecordSet.CursorLocation=3;//при 2 ошибка
RecordSet.CursorType = 3;
RecordSet.LockType = 2;
RecordSet.Open(ТекстЗапроса, ОлеДБ);
с=1;
Пока RecordSet.EOF() = 0 Цикл
RecordSet.Fields("II").Value=с;
RecordSet.Update();
с=с+1;
RecordSet.MoveNext();  
КонецЦикла;
RecordSet.Close();
Может кто подскажет как это можно ускорить.
1 mikecool
 
30.04.21
11:03
засунуть тз как параметр или темп таблицу вариант?
тогда update from select
2 ДенисЧ
 
30.04.21
11:04
100500 запросов к серверу? Радуйся, что у него нет ножек...
3 H A D G E H O G s
 
30.04.21
11:04
(0) bulk insert то есть у ваших foxpro?
4 vsy
 
30.04.21
11:07
(1) По подробнее можно.
5 Builder
 
30.04.21
11:12
(0) Это разовая обработка? С этой таблицей dbf еще кто-то работает в этот момент?
Не проще было бы напрямую из 7.7 работать с DBF файлом?
6 vsy
 
30.04.21
11:13
(5) Никто больше не работает. Я не понял как еще прямее обращаться к дбф.
7 vsy
 
30.04.21
11:14
Эта таблица не не база 1с
8 mikecool
 
30.04.21
11:16
(7) поддержу товарища (3) - если есть BI - то лучше им, подготовил набор и захерацил в продакшн
9 Mikeware
 
30.04.21
11:16
(0) прочитать про волшебное слово update
(7) и что это меняет? разве что еще проще...
10 vsy
 
30.04.21
11:19
(9) Так направь в нужное русло. Дай умную мысль. Может я чего то не понимаю.
11 Василий Алибабаевич
 
30.04.21
11:21
(9) У него есть "update" в oledb. ВотЪ: "UPDATE KL SET II = :счетчик WHERE II=:ид"

(0) Я бы попробовал вначале всего проиндексировать по полю "II".
12 Mikeware
 
30.04.21
11:21
(10) русел много... от СоздатьОбъект("XBase") до "Update set aa=123 from BBB where ссс=987"
13 Garykom
 
гуру
30.04.21
11:24
длина рогов на ум оленя не влияет
14 vsy
 
30.04.21
11:27
(11) Вроде индекс по этому полю есть. Попробовать можно.
(12) С XBase вообще умирает.
15 Garykom
 
гуру
30.04.21
11:33
(14) >С XBase вообще умирает.

Еще во времена 7.7 и 8.1 через dbf файлы обменивались справочниками пациентов, там полляма примерно было
и оно минут 20 полная выгрузка через xbase была

Ты не запросы делай, а полный перебор по условию
16 Garykom
 
гуру
30.04.21
11:35
(15)+ 150000 это фигня кстати на современном железе на ssd особенно
17 vsy
 
30.04.21
11:37
(14) Согласен, но есть задача и надо попытаться ее решить. Условия нет, нужно тупо все записи изменить.
18 Garykom
 
гуру
30.04.21
11:38
(17) тупо читаешь из одной dbf и пишешь с изменениями в другую
19 vsy
 
30.04.21
11:40
(17) Нет в табличку записываются данные  из фронтола, а потом уже из 1с модифицируются.
20 Василий Алибабаевич
 
30.04.21
11:48
(19) Сколько записей в "тз"?
21 Garykom
 
гуру
30.04.21
11:50
(20) он жалуется что 150к запросов в цикле тормозит аж 1.5 часа
22 vsy
 
30.04.21
11:55
(19) тз=количество записей в таблице
23 vsy
 
30.04.21
12:14
Всем спасибо задача решена. Время на 150000 записей 34,945 сек.
24 Garykom
 
гуру
30.04.21
12:17
(23) ииии?
код покажи