Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.20;
Скачать: CL | DM;

Вниз

Медленная вставка через TIBScript   Найти похожие ветки 

 
tomkat   (2010-02-17 10:59) [0]

День добрый ! подскажите , в чем может быть причина медленной вставки данныйх через компоненту ТIBScript ? 10000 записей вставляет 7 секунд, а через IBExpert - около секунды тем же скриптом ?
почему же так ? Спасибо ....


 
tomkat   (2010-02-17 11:05) [1]

простите, ошибся 1000 записей за 7 секунд ...... медленно , однако ....


 
Сергей М. ©   (2010-02-17 11:12) [2]

> а через IBExpert - около секунды тем же скриптом

Так IBExpert наверняка выполняет все эти вставки в контексте одной и той же транзакции и не коммитит ее при каждой вставке ..


 
tomkat   (2010-02-17 11:16) [3]

гм, так и я не коммичу ...
стартую транзакцию , запускаю скритп с 1000 записей типа
insert into payf_temp (accnum,summa,drfo,filecode) values ("26256000000000","1034","2290015000","000");
после того делаю  Transaction.Commit;


 
Сергей М. ©   (2010-02-18 09:52) [4]

Тогда есть предположение, что запрос на стороне твоего клиента препарируется тобой (возможно неявно) всякий раз заново перед каждой экзекуцией ..


 
tomkat   (2010-02-18 11:25) [5]

тоесть , у TIBScript такое дивное свойство , препарить каждую строку ? но ведь выполняет он его целиком , вернее выполняет сервер, а TIBScript только передает ...неужто он его построчно передает ?
код банален

   ibscript1.Script.Clear;
   ibscript1.Script.Add(memo.Text);
   
   trnsWrite.StartTransaction;
    ibscript1.ExecuteScript;
   trnsWrite.Commit;


параметры trnsWrite
 read_committed
 rec_version
 nowait


 
Сергей М. ©   (2010-02-18 16:33) [6]

т.е. в Memo у тебя среди прочего необходимого 1000 одинаковых последовательно расположенных строк, содержаших одно и то же INSERT-предложения, так ?


 
tomkat   (2010-02-18 16:46) [7]

ну типа вот такого
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26250000001246","1200","1569302195","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26258000000647","1200","1596403268","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26251000000666","484","1210900891","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26256000001336","1156","1938605838","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26257000003076","1050","1168701077","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26253000000879","1115","2351706282","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26257000001595","1200","1777306582","000");
insert into pfb_payf_temp (accnum,summa,drfo,filecode) values ("26257000000198","1200","1953516005","000");

и так  1000 раз ....


 
Сергей М. ©   (2010-02-19 09:17) [8]

А в чем "прелесть" ?
Чем не угодил циклический вызов параметрического запроса (IBQuery или IBDataset) на вставку ?


 
tomkat   (2010-02-19 09:47) [9]


> Чем не угодил циклический вызов параметрического запроса
> (IBQuery или IBDataset) на вставку ?

тем, что перебором , на каждую запись вызывается запрос....
просто пробовал и запросом на клиенте вставлять , и вызывать процедуру из базы с передачей ей параметров .... все медленно , скриптом быстрее всего, но тоже не очень


 
sniknik ©   (2010-02-19 10:16) [10]

> ну типа вот такого
> ...
а там не пройдет типа как в mssql, и не будет ли быстрее  
insert into pfb_payf_temp
select * from (
select accnum="26250000001246",summa=1200,drfo=1569302195,filecode=000 union all
select "26258000000647",1200,1596403268,000 union all
select "26251000000666",484,1210900891,000 union all
select "26256000001336",1156,1938605838,000 union all
select "26257000003076",1050,1168701077,000 union all
select "26253000000879",1115,2351706282,000 union all
select "26257000001595",1200,1777306582,000 union all
select "26257000000198",1200,1953516005,000) a


?

не ручаюсь за синтаксис но сам смысл.


 
tomkat   (2010-02-19 10:25) [11]


> а там не пройдет типа как в mssql, и не будет ли быстрее
>  
> insert into pfb_payf_temp

было, делал, НО ! нарвался на интересную деталь : количество UNION не более 255 раз :-) идея хороша, почти сработало, но .... 255 и не более


 
sniknik ©   (2010-02-19 10:30) [12]

255 всего или в одном обьединении?
а то
select * from (
 select ... union all
 ... 253 ...
 select ... union all
)
union all
... 253 ...
select * from (
 select ... union all
 ... 253 ...
 select ... union all
)

255*255 = 65025, ну и дальше "расширить" можно аналогично, пока на ограничение по вложенности не нарвешься.


 
tomkat   (2010-02-19 10:41) [13]

да , так думал сделать .....цикл в 254 шага, потом поворение ..... , наверно, единственный выход , но будет ли он быстрее


 
Сергей М. ©   (2010-02-19 11:58) [14]


> тем, что перебором , на каждую запись вызывается запрос


Так он же, этот запрос, препарируется  ОДИН раз, при первом  Execute ..
А при последующих он уже препарирован и время на препарацию не тратится ..


 
tomkat   (2010-02-19 12:25) [15]

гм .. не понял , как это только при первом .... я так понимаю, предлагается следующие :
есть набор данных, на основании к-го генерируется запрос вставки, пусть это строки в МЕМО
,значит, читаем мемо построчно и на каждую строку выполняем либо INSERT в DataSet с параметром или вызов ХП тоже с передачей параметров, так ?
что-то типа :
  while memLog.Lines.num <=memLog.Lines.Count
   do begin
       qryIns.paramByName("par1","par2","par3","par4").value=memLog.Lines.value //ну примерно
      qryIns.Execute;
   end
тоесть , запрос препарится при первом шаге, а при последующих, он как бы уже препаренный ??? странно это ...


 
Сергей М. ©   (2010-02-19 12:32) [16]

> странно это ..

Что странно-то ?

Справку открой по теме "ExecSQL method (TIBQuery)" и убедись сам ..


 
tomkat   (2010-02-19 12:45) [17]

ладно, спорить не буду , попробую перебор .....
но интересно всеже, почему IBExpert выполняет скрипт за 1,5 секунды, а на клиенте  через IBScrept - 7секунд ... вот в чем вопрос ...


 
Loginov Dmitry ©   (2010-02-20 00:38) [18]


> но интересно всеже, почему IBExpert выполняет скрипт за
> 1,5 секунды, а на клиенте  через IBScrept - 7секунд ...
> вот в чем вопрос ...


Думается, что проблема в IBScript, раз такая разница.
Скорее всего, обычный препарированный запрос INSERT с параметрами сравняет скорость.
(Честно говоря, не помню ситуации, когда скорость INSERT у меня опускалась ниже 5000 записей в секунду)


 
PEAKTOP ©   (2010-02-22 03:23) [19]

sniknik ©   (19.02.10 10:30) [12]
> 255 всего или в одном обьединении?
....
> 255*255 = 65025, ну и дальше "расширить" можно аналогично, пока на ограничение по вложенности не нарвешься.


Предложенный Вами способ не подходит, и упирается все далеко не в TIBScript.

В Firebird есть ограничение на 255 реляций (уникальных обращений к таблицам, хранимым процедурам, представлениям) в одном контексте (запросе, теле хранимой процедуры, в теле триггера, в теле PSQL-блока).

Изменить это значение можно в разделе констант исходников и пересобрав Firebird самостоятельно.

-----------------------
По теме топика: у автора ошибка в 17 строке. Иные варианты объяснения не подходят. у Хвастунова в IBExpert-e  далеко не "космические технологии" и "прямая связь с богом", те же самые допиленные [IBX]->[FIBPlus ранних версий] -> [компоненты доступа IBExpert]. И, как мы видим, все работает на ура.

Другой момент: раз уж автор взялся пользовать поделку IBX, хоть бы почитал про объекты TIBOutputDelimitedFile/TIBInputDelimitedFile, их связку с TIBSQL и про то как все кошерно и красиво делается этими объектами. Я имею в виду выгрузку/загрузку пакета большого записей из базы в базу.

В общем, читать "IBSql.pas" до полного просветвления.


 
turbouser ©   (2010-02-22 11:24) [20]


> PEAKTOP ©   (22.02.10 03:23) [19]


> те же самые допиленные [IBX]->[FIBPlus ранних версий] ->
> [компоненты доступа IBExpert]

откедова дровишки? всегда дума что там фибы.. без допиливаний..


 
PEAKTOP ©   (2010-02-24 01:44) [21]

> откедова дровишки? всегда дума что там фибы.. без допиливаний.

Хвастунов постоянный читатель форумов в Firebird Foundation и на SQL.RU. Очень редко что-то постит, в основном ответы на пинки по поводу егойного IBExpert.

Да, там FIBPlus ранних версий. Допиленная. Поэтому в сборки не включаются свежие версии FIBPlus.



Страницы: 1 вся ветка

Текущий архив: 2011.11.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
15-1311598347
fzt
2011-07-25 16:52
2011.11.20
Как писать плагин к Delphi? для чайников


15-1311261832
Студент
2011-07-21 19:23
2011.11.20
Что учить?


15-1310568829
Делфиец
2011-07-13 18:53
2011.11.20
Хочу программистом в Питер


15-1311199461
Делфиец
2011-07-21 02:04
2011.11.20
А есть ли в Питере?


2-1311843120
Александр160591
2011-07-28 12:52
2011.11.20
запарка с компонентами и их свойствами