![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FibPlus - есть ли аналог UpdateBatch ? [D6, FireBird 1.5]
без ника © (2006-09-19 11:09:00)Есть ли в компонентах FibPlus аналог UpdateBatch из ADO?
Сейчас я добавляю (изменяю) данные с помощью сторед процедур(TFibStoredProc) . Но иногда бывает, что изменяется сразу 50-100 записей - подтормаживает. Хотелось бы отдать серверу изменения 1 пакетом.
без ника (2006-09-20 11:08:00) [1]в принципе данный синтаксис поддерживается. Но неподдерживается синтаксис(хотя я пока поверхностно смотрел) :
Select 1 AS P1,
2.3 AS P2,
'XX' AS P3
так бы можно было создать большойSQL запрос вида:
inser Into T(P1,P2,P3)
From ( SELECT 1 AS P1,
2.3 AS P2,
'XX' AS P3
UNION ALL
SELECT 3 AS P1,
55.1 AS P2,
'YY' AS P3
....
)
Но во первых не очень хочется делать все ручками :) а во вторых по опыту общения с MSSQL, знаю, что есть какое то ограничение на объем передаваемого SQL запроса (хотя может это и пролемы ADO). А тут он може оказаться громадным -> его придется разбивать на несколько INSERT'ов. В принципе пока быстродействия хватает, потом можно будет попробовать и такой вариант.
ANB (2006-09-19 17:12:00) [2]
> без ника (19.09.06 16:33) [7]
Есть идея.
FB поддерживает конструкцию типа :
select * from
(
select 1 ID 'Вася' Name from dual
union all
select 2 ID 'Петя' Name from dual
union all
select 3 ID 'Коля' Name from dual
)
?
без ника (2006-09-19 16:33:00) [3]Да из за этих накладных расходов тормоза и образуются.
Данные для вставки - это список(аналог TList'a ток под типизированные данные). Точнее скажем, так буфер куда приходят результаты измерений, их нужно просто тупо записать в базу. Желательно побыстрее :)
ANB (2006-09-19 12:51:00) [4]
> без ника (19.09.06 12:11) [4]
Пынятно, сам вызов хранимки тоже время кушает.
Откуда данные для вставки берешь ?
без ника (2006-09-19 12:12:00) [5]А ну да, если нужно сделать множественный Update - собственно заполнить SQL на Update :)
без ника (2006-09-19 12:11:00) [6]2000 - вставок в цикле ~ 2 сек,а если делать 1000 вызовов хранимой процедуры уже ~ 6 сек.
без ника (2006-09-19 12:09:00) [7]собственно о чем писал:
Допустим есть процедура для вставки записи StoredProc1. Чтобы вставить 100 записей - 100 вызовов. Тормоза. Самому генерировать скрипт на Insert хм... скажем так не охота :)
Нашел решение для Fib, собственно делается с пом-ю FibDataSet :
1. Прописать SQL на SELECT 'SELECT P1,P2,P3 FROM T';
2. Прописать SQL на Insert 'INSERT INTO T (P1,P2,P3) VALUES (:P1,:P2,:P3)';
3. FibDataSet.CachedUpdates := True;
3. FibDataSet.Active:=True;
4. далее в цикле :
FibDataSet.Append;
FibDataSet.FieldByName('P1').Value := XXXX;
....
FIBDataSet.Post;
и потом FibDataSet.ApplyUpdates;
ну и транзакцию Commit; Вот так решилась проблема.
Виталий Панасенко (2006-09-19 12:06:00) [8]кэширование тебе поможет(должно)
ANB (2006-09-19 11:47:00) [9]Что значит пакетом ? Много маленьких апдейтов - сильно быстрее не будет, т.к. все равно по очереди выполнятся будут.
Напиши один грамотный апдейт и выполни.