Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Вниз

Медленная вставка через 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.004 c
15-1311539404
Юрий
2011-07-25 00:30
2011.11.20
С днем рождения ! 25 июля 2011 понедельник


15-1311280188
Юрий
2011-07-22 00:29
2011.11.20
С днем рождения ! 22 июля 2011 пятница


4-1251990104
TIF
2009-09-03 19:01
2011.11.20
Windows XP: вызвать диалог "Установка программы от другого имени"


3-1266392510
Layner9
2010-02-17 10:41
2011.11.20
TPopupDataGridEh > DBLookupComboboxEh


15-1311915862
И. Павел
2011-07-29 09:04
2011.11.20
Восстановление бекапа БД в другую БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский