Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2009, 17:55   #21
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

короче по порядку.
1) p0 f0 Это настоящие имена полей...или переменные.
2) Quick - IBSQL - У этого компанента вообще есть ParamByName ?
пишу
Код:
showmessage(drfiski.Quick.ParamByName('f0').Value)
или
Код:
showmessage(drfiski.Quick.ParamByName('f0').string)
пишет что не нашёл такой index (ну принцепи правильно...поле называется по другому)
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 03.08.2009, 18:06   #22
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

кстати
занимательная получается арифметика
если заполнять инсертный скрипт в приладе, то время его заполнения изменяется по параболе, т.е. если 1000 строк в скрипт записали за 7 сек, то 2000 строк запишем уже за 30 сек (т.е. умножаем не на 2, а на 2*2), а 4000 строк - за 120 сек
а выполнение скрипта - линейно, соответственно, 2 сек, 4 сек, 9 сек

З.Ы.: брал системное время поэтому округление до секунд

Цитата:
Сообщение от BARNEY Посмотреть сообщение
Код:
showmessage(drfiski.Quick.ParamByName('f0').string)
пишет что не нашёл такой index (ну принцепи правильно...поле называется по другому)
ну логично, что любой пример с форума нужно заточить под себя

еще немного арифметики
если собирать запрос без параметризации, то 2000 строк вставляет за 10 сек, 4000 строк за 20 сек, 10000 строк за 72 сек
с параметризацией - 9, 17, 44 сек соответственно
если написать ХП для импорта данных на принимающей БД и параметры заполнять в цикле, то время импорта сопоставимо с импортом через запрос с параметризацией

даже здесь видно что выигрыш от параметризации при масштабировании растет от 1,5 и более раз по сравнению со сборкой запроса в строку, т.е. парметризация должна помочь выполнить импорт 660 000 строк за 5,5-7 минут (а может и быстрее)

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

З.Ы.2: если кому интересно самостоятельно поиграться, то могу выложить скрипт и прогу для тестов (тестировал на Оракле, но при желании можно переписать под свои версии СУБД)

Последний раз редактировалось soleil@mmc; 03.08.2009 в 18:58.
soleil@mmc вне форума Ответить с цитированием
Старый 04.08.2009, 08:02   #23
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

937 записей в сек через параметр.... на 337 записей быстрее время выгрузки 11:30.... Неплохо... в 5-7 не уложился
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 04.08.2009, 11:17   #24
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от BARNEY Посмотреть сообщение
937 записей в сек через параметр.... на 337 записей быстрее время выгрузки 11:30.... Неплохо... в 5-7 не уложился
по моему коду проверил импорт 100 000 записей
без параметризации - 824 сек, с параметризацией - 444 сек
тестовый сервак должен быть медленным - тогда на нем видно все затыки, которые могут возникнуть в будущем в бою

покажи свой код
soleil@mmc вне форума Ответить с цитированием
Старый 04.08.2009, 13:08   #25
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Код:
ProgrammMain.IBQ.SQL.Text:='insert into polis (ss, fam, im, ot, sex, dr, type_doc, '
+'SERIESNUMBER, SOC, RR, NP, STREET, BUILD, KORPUS, HOUSE, FLAT, SERIES, NUMBER, '
+' DATE_OUT, START_DATE, END_DATE, IS_ACTIVE, DIAL_NUMBER, URPERS, U_INN, U_KPP, '
+' CODE_BASE, CODE_SMO, SYN_DATE, SOURSE_ID, CODE_OTKAZ) '
+' values (:ss, :fam, :im, :ot, :sex, :dr, :type_doc, '
+' :SERIESNUMBER, :SOC, :RR, :NP, :STREET, :BUILD, :KORPUS, :HOUSE, :FLAT, :SERIES, :NUMBER, '
+' :DATE_OUT, :START_DATE, :END_DATE, :IS_ACTIVE, :DIAL_NUMBER, :URPERS, :U_INN, :U_KPP, '
+' '''+drfiski.edit1.Text+''',''1'',:SYN_DATE, :SOURSE_ID,0)';
while (not drfiski.Quick.Eof) do
  begin
   try
  ProgrammMain.IBQ.ParamByName('SS').Value:=drfiski.Quick.Fields[0].AsString;
  ProgrammMain.IBQ.ParamByName('fam').Value:=drfiski.Quick.Fields[1].AsString;
  ProgrammMain.IBQ.ParamByName('im').Value:=drfiski.Quick.Fields[2].AsString;
  ProgrammMain.IBQ.ParamByName('ot').Value:=drfiski.Quick.Fields[3].AsString;
  ProgrammMain.IBQ.ParamByName('sex').Value:=drfiski.Quick.Fields[4].AsString;
  ProgrammMain.IBQ.ParamByName('dr').Value:=drfiski.Quick.Fields[5].AsString;
  ProgrammMain.IBQ.ParamByName('type_doc').Value:=drfiski.Quick.Fields[6].AsString;
  ProgrammMain.IBQ.ParamByName('SERIESNUMBER').Value:=drfiski.Quick.Fields[7].AsString;
  ProgrammMain.IBQ.ParamByName('SOC').Value:=drfiski.Quick.Fields[8].AsString;
  ProgrammMain.IBQ.ParamByName('RR').Value:=drfiski.Quick.Fields[9].AsString;
  ProgrammMain.IBQ.ParamByName('NP').Value:=drfiski.Quick.Fields[10].AsString;
  ProgrammMain.IBQ.ParamByName('STREET').Value:=drfiski.Quick.Fields[11].AsString;
  ProgrammMain.IBQ.ParamByName('BUILD').Value:=drfiski.Quick.Fields[12].AsString;
  ProgrammMain.IBQ.ParamByName('KORPUS').Value:=drfiski.Quick.Fields[13].AsString;
  ProgrammMain.IBQ.ParamByName('HOUSE').Value:=drfiski.Quick.Fields[14].AsString;
  ProgrammMain.IBQ.ParamByName('FLAT').Value:=drfiski.Quick.Fields[15].AsString;
  ProgrammMain.IBQ.ParamByName('SERIES').Value:=drfiski.Quick.Fields[16].AsString;
  ProgrammMain.IBQ.ParamByName('NUMBER').Value:=drfiski.Quick.Fields[17].AsString;
  ProgrammMain.IBQ.ParamByName('DATE_OUT').Value:=drfiski.Quick.Fields[18].AsString;
  ProgrammMain.IBQ.ParamByName('START_DATE').Value:=drfiski.Quick.Fields[19].AsString;
  ProgrammMain.IBQ.ParamByName('END_DATE').Value:=drfiski.Quick.Fields[20].AsString;
  ProgrammMain.IBQ.ParamByName('IS_ACTIVE').Value:=drfiski.Quick.Fields[21].AsString;
  ProgrammMain.IBQ.ParamByName('DIAL_NUMBER').Value:=drfiski.Quick.Fields[22].AsString;
  ProgrammMain.IBQ.ParamByName('URPERS').Value:=drfiski.Quick.Fields[23].AsString;
  ProgrammMain.IBQ.ParamByName('U_INN').Value:=drfiski.Quick.Fields[24].AsString;
  ProgrammMain.IBQ.ParamByName('U_KPP').Value:=drfiski.Quick.Fields[25].AsString;
  ProgrammMain.IBQ.ParamByName('SYN_DATE').Value:=drfiski.Quick.Fields[26].AsString;
  ProgrammMain.IBQ.ParamByName('SOURSE_ID').Value:=drfiski.Quick.Fields[27].AsString;

  ProgrammMain.IBQ.ExecQuery;
     except
  drfiski.memo1.Lines.Add(ProgrammMain.IBQ.SQL.Text);
     end;
    ii:=ii+1;
    drfiski.Quick.Next;
    Synchronize(progress);
    Application.ProcessMessages;
  end;
Код:
procedure MyPotok.progress;
begin
drfiski.Label2.Caption:=IntToStr(ii);
drfiski.Gauge1.Progress:=ii;
end;
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 04.08.2009, 13:54   #26
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

можно ради интереса попробовать без отображения хода работы (без синхронизации)
может еще немного выгадаешь
soleil@mmc вне форума Ответить с цитированием
Старый 04.08.2009, 15:22   #27
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вспомнил о еще одной возможности
делаем так
переписываем основной запрос так, чтобы он возвращал одну колонку, которая будет содержать текст инсерта одной строки
в цикле собираем весь список инсерта с разделителями (да хоть в стринглист) и сохраняем его в файло, а файло уже скармливаем скрипто-игрателю
вполне себе шустро должно выйти
soleil@mmc вне форума Ответить с цитированием
Старый 05.08.2009, 06:45   #28
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

не совсем понял...что вы имеете введу...можно наглядно на примере?
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 05.08.2009, 11:59   #29
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

что-то типа такого
Код:
select 'insert into polis (ss, fam, im, ot, sex, dr, type_doc, seriesnumber, soc, rr, np, street, build, korpus, house, flat, ' ||
                                'series, number, date_out, start_date, end_date, is_active, ' || 
                                'dial_number, urpers, u_inn, u_kpp, code_base, code_smo, syn_date, sourse_id, code_otkaz) ' ||
                                'values('|| /* здесь конкатенация значений этих полей со всеми запятыми и кавычками  */ ||')' f0 
from polis
но я сталкивался в ИБ/ФБ с тем, что передача параметра в список селекта не работает (это речь про передачу в селект
вот этого drfiski.edit1.Text) - выскакивает ошибка (в Оракле такого нет)
поэтому лучше создать селективную ХП - на вход ей отдавать этот самый drfiski.edit1.Text и на выходе получать уже
готовый список инсерта

дальше этот список сохранять в файл и скармливать его скриптоигрателю

/* здесь просто поток мыслей */
наверняка, в ФБ есть возможность работать с файловой системой из базы, т.е. можно весь курсор вставки сохранить в файл
прямо из ХП, минуя приложение и тогда прилада будет только вызывать ХП, передавай ей параметр drfiski.edit1.Text, и далее
по результату выполнения ХП вызывать скриптоигратель

Последний раз редактировалось soleil@mmc; 05.08.2009 в 12:05.
soleil@mmc вне форума Ответить с цитированием
Старый 11.09.2009, 16:51   #30
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

было время и я поигрался тут еще немного с вариантом "выбрать записи и, сформировав из низ скрипт вставки, записать его в файло"
с помощью стримов вышло вполне себе шустро

забить файл-скрипт подобными строками
Код:
insert into atest$test 
(f_str_00, f_str_01, f_str_02, f_str_03, f_str_04, f_str_05, f_str_06, f_str_07, f_str_08, f_str_09, 
f_str_10, f_str_11, f_str_12, f_str_13, f_str_14, f_str_15, f_str_16, f_str_17, f_str_18, f_str_19, 
f_str_20, f_str_21, f_str_22, f_str_23, f_str_24, f_str_25, f_str_26, f_str_27, f_num_28) 
values('rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 
'rueieqworyeiuowyqiuryeiwouryeqiwou', 'rueieqworyeiuowyqiuryeiwouryeqiwou', 3) 
/
в кол-ве 200 000 элементов вставки на той же машине что и предыдущие эксперименты заняло по времени 332 сек
естественно, этот файлик еще нужно скормить скл*плюс-у(скриптоигрателю) для заливки данных и это тоже займет какое-то время, но вот для варианта когда нужно эту кучу данных залить в несколько баз уместнее будет такой вариант - тратим туеву кучу времени сравнимую с одним циклом "выбрать-вставить" все данные через приладу (стратегия, которую использовал ТС), но зато на загрузку данных в каждую следующую БД тратим существенно меньше времени
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с запросом euronymous SQL, базы данных 12 18.03.2012 05:24
Помогите с запросом NATAHA Microsoft Office Access 2 08.05.2009 15:17
Помогите с запросом Айвенго Microsoft Office Access 3 08.05.2008 09:07
Помогите с запросом Blackmore БД в Delphi 3 07.05.2008 01:18
помогите с запросом 9-11 БД в Delphi 4 20.11.2006 10:04