Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Что значит пакетом ? Много маленьких апдейтов - сильно быстрее не будет, т.к. все равно по очереди выполнятся будут.
Напиши один грамотный апдейт и выполни.


Наверх

Титульная страница Поиск, карта сайта Написать письмо