Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Как ускорить запрос

v7: Как ускорить запрос
Я
   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();
Может кто подскажет как это можно ускорить.
   mikecool
 
1 - 30.04.21 - 11:03
засунуть тз как параметр или темп таблицу вариант?
тогда update from select
   ДенисЧ
 
2 - 30.04.21 - 11:04
100500 запросов к серверу? Радуйся, что у него нет ножек...
   H A D G E H O G s
 
3 - 30.04.21 - 11:04
(0) bulk insert то есть у ваших foxpro?
   vsy
 
4 - 30.04.21 - 11:07
(1) По подробнее можно.
   Builder
 
5 - 30.04.21 - 11:12
(0) Это разовая обработка? С этой таблицей dbf еще кто-то работает в этот момент?
Не проще было бы напрямую из 7.7 работать с DBF файлом?
   vsy
 
6 - 30.04.21 - 11:13
(5) Никто больше не работает. Я не понял как еще прямее обращаться к дбф.
   vsy
 
7 - 30.04.21 - 11:14
Эта таблица не не база 1с
   mikecool
 
8 - 30.04.21 - 11:16
(7) поддержу товарища (3) - если есть BI - то лучше им, подготовил набор и захерацил в продакшн
   Mikeware
 
9 - 30.04.21 - 11:16
(0) прочитать про волшебное слово update
(7) и что это меняет? разве что еще проще...
   vsy
 
10 - 30.04.21 - 11:19
(9) Так направь в нужное русло. Дай умную мысль. Может я чего то не понимаю.
   Василий Алибабаевич
 
11 - 30.04.21 - 11:21
(9) У него есть "update" в oledb. ВотЪ: "UPDATE KL SET II = :счетчик WHERE II=:ид"

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.