Конференция "Базы" » Медленная вставка через TIBScript [D6, FB 2.0]
 
  • tomkat (17.02.10 10:59) [0]
    День добрый ! подскажите , в чем может быть причина медленной вставки данныйх через компоненту ТIBScript ? 10000 записей вставляет 7 секунд, а через IBExpert - около секунды тем же скриптом ?
    почему же так ? Спасибо ....
  • tomkat (17.02.10 11:05) [1]
    простите, ошибся 1000 записей за 7 секунд ...... медленно , однако ....
  • Сергей М. © (17.02.10 11:12) [2]
    > а через IBExpert - около секунды тем же скриптом

    Так IBExpert наверняка выполняет все эти вставки в контексте одной и той же транзакции и не коммитит ее при каждой вставке ..
  • tomkat (17.02.10 11:16) [3]
    гм, так и я не коммичу ...
    стартую транзакцию , запускаю скритп с 1000 записей типа
    insert into payf_temp (accnum,summa,drfo,filecode) values ("26256000000000","1034","2290015000","000");


    после того делаю  Transaction.Commit;
  • Сергей М. © (18.02.10 09:52) [4]
    Тогда есть предположение, что запрос на стороне твоего клиента препарируется тобой (возможно неявно) всякий раз заново перед каждой экзекуцией ..
  • tomkat (18.02.10 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
  • Сергей М. © (18.02.10 16:33) [6]
    т.е. в Memo у тебя среди прочего необходимого 1000 одинаковых последовательно расположенных строк, содержаших одно и то же INSERT-предложения, так ?
  • tomkat (18.02.10 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 раз ....
  • Сергей М. © (19.02.10 09:17) [8]
    А в чем "прелесть" ?
    Чем не угодил циклический вызов параметрического запроса (IBQuery или IBDataset) на вставку ?
  • tomkat (19.02.10 09:47) [9]

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

    тем, что перебором , на каждую запись вызывается запрос....
    просто пробовал и запросом на клиенте вставлять , и вызывать процедуру из базы с передачей ей параметров .... все медленно , скриптом быстрее всего, но тоже не очень
  • sniknik © (19.02.10 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 (19.02.10 10:25) [11]

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

    было, делал, НО ! нарвался на интересную деталь : количество UNION не более 255 раз :-) идея хороша, почти сработало, но .... 255 и не более
  • sniknik © (19.02.10 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 (19.02.10 10:41) [13]
    да , так думал сделать .....цикл в 254 шага, потом поворение ..... , наверно, единственный выход , но будет ли он быстрее
  • Сергей М. © (19.02.10 11:58) [14]

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


    Так он же, этот запрос, препарируется  ОДИН раз, при первом  Execute ..
    А при последующих он уже препарирован и время на препарацию не тратится ..
  • tomkat (19.02.10 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
    тоесть , запрос препарится при первом шаге, а при последующих, он как бы уже препаренный ??? странно это ...
  • Сергей М. © (19.02.10 12:32) [16]
    > странно это ..

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

    Справку открой по теме "ExecSQL method (TIBQuery)" и убедись сам ..
  • tomkat (19.02.10 12:45) [17]
    ладно, спорить не буду , попробую перебор .....
    но интересно всеже, почему IBExpert выполняет скрипт за 1,5 секунды, а на клиенте  через IBScrept - 7секунд ... вот в чем вопрос ...
  • Loginov Dmitry © (20.02.10 00:38) [18]

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


    Думается, что проблема в IBScript, раз такая разница.
    Скорее всего, обычный препарированный запрос INSERT с параметрами сравняет скорость.
    (Честно говоря, не помню ситуации, когда скорость INSERT у меня опускалась ниже 5000 записей в секунду)
  • PEAKTOP © (22.02.10 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" до полного просветвления.
 
Конференция "Базы" » Медленная вставка через TIBScript [D6, FB 2.0]
Есть новые Нет новых   [134434   +27][b:0][p:0.002]