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