powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вставка в Firebird посредством Array DML (FireDAC)
25 сообщений из 73, страница 2 из 3
Вставка в Firebird посредством Array DML (FireDAC)
    #39653932
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FПолучается, при допущении, что FireDAC для эмуляции пакетной вставки организует блоки с пачками инсертов, то на ограничение по п.1 мы выходим первым, а ведь 256, для размера подобного пакета, на мой взгляд, это вообще ни о чем.
тем не менее, это в 256 раз меньше сетевых раундтрипов

Vlad FДмитрий, а вот про снятие данного ограничения в четверке это от чего зависит и какова на сегодняшний день вероятность его снятия? И если будет снято, то каким ожидается новый предел?
зависит от времени доделать патч. Пока приоритеты на другом сфокусированы. Новый предел 2^32.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39653964
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrтем не менее, это в 256 раз меньше сетевых раундтрипов

Не совсем так. Это меньше трипов при исполнении, но при препарации метаданные передаются
небольшими кусками и там может быть до 256 раз больше трипов. Так что если роделывать
данный трюк без применения мозга и препарировать отдельный EB на каждое исполнение, можно
получить нулевой или даже отрицательный эффект.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39653973
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> препарировать отдельный EB на каждое исполнение

Там один препаре с тучей параметров. Ну, вернее 2 - конечный кусок маленький.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655008
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrVlad FПолучается, при допущении, что FireDAC для эмуляции пакетной вставки организует блоки с пачками инсертов, то на ограничение по п.1 мы выходим первым, а ведь 256, для размера подобного пакета, на мой взгляд, это вообще ни о чем.
тем не менее, это в 256 раз меньше сетевых раундтрипов
Меньше то оно, конечно, меньше, ну а самое главное, что не оказалось на самом деле пределом для обсуждаемого Array DML, который почему-то не вываливает ничего прохожего на too many contexts и при гораздо больших значениях пакетного массива. Ну или мы не совсем верно предполагаем, как он там внутри использует execute block.
Vlad FДмитрий, а вот про снятие данного ограничения в четверке это от чего зависит и какова на сегодняшний день вероятность его снятия? И если будет снято, то каким ожидается новый предел?
зависит от времени доделать патч. Пока приоритеты на другом сфокусированы. Новый предел 2^32.
Я бы даже сказал, что это уже беспредел какой то!! Хорошо подождем, тем более что от беты четверки в первую очередь жду truncate table и decfloat. Кстати, семантика привычных нумериков будет как-то расширена с появлением decfloat, с тем чтобы их можно было объявлять с точностью более 18, а на самом деле под ними движок самостоятельно оперировал decfoat-ами??
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655021
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FКстати, семантика привычных нумериков будет как-то расширена с появлением decfloat, с тем чтобы их можно было объявлять с точностью более 18, а на самом деле под ними движок самостоятельно оперировал decfoat-ами??

да. Оно уже есть. Точность до 34 цифр. Вот только не задача, компоненты доступа сами по себе не научатся работать с DecFloat. Там конечно есть обходные пути (возвращать клиенту строковое представление), но работать с ними уже не так удобно.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655049
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FМеньше то оно, конечно, меньше, ну а самое главное, что не оказалось на самом деле пределом для обсуждаемого Array DML, который почему-то не вываливает ничего прохожего на too many contexts и при гораздо больших значениях пакетного массива. Ну или мы не совсем верно предполагаем, как он там внутри использует execute block.Batch API никак не использует execute block.
Не нужно тыкать пальцем в небо.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655053
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Из твоего ответа, однако, не становится ясным, можно ли будет не объявлять явным образом decfloat-поля, а с тем же успехом пользовать numeric(x>18, x) ?? Что же касается маппинга на конкретные типы полей в клиентских библиотеках, то вполне бы устроило, если бы оно автоматом маппилось на те же FmtBcd-типы, что и, к примеру, numeric(18, 4) в настоящее время.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655058
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladBatch API никак не использует execute block.

Никто и не утверждал обратного. Речь об Array DML, эмулируемом на уровне FireDAC.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655062
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

Да NUMERIC(34, x) и DECIMAL(34, x) можно использовать. В новом API есть методы для преобразования DecFloat в BCD но их нужно ещё вызвать. Если в компонентах этих вызовов нет, то ничего не выйдет.
А биндинги для поддержки старых клиентов есть, там варианты либо на BIGINT, DOUBLE PRECISION (если точности хватает), либо на строку.

Скачай в конце концов себе снапшот и пощупай его. Он кстати устойчивый. IBE частично уже умеет работать с 4.0
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655064
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladBatch API никак не использует execute block.
Не нужно тыкать пальцем в небо.
Согласен, не нужно. Но мы, КМК, не обсуждае сейчас модерновое, Batch API, а продолжаем исследовать особенности Array DML (FireDAC), ради чего, собственно и была создана тема. А про нее Эмбаркадера божится, по ссылке, что я давал выше, что для FB оно так или иначе через execute block. Ты давай, вспоминай.))
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655066
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

Значит я не так тебя понял
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655073
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Так вот с одной стороны они там заявляют про execute block, с другой стороны оно у меня не упало при размерах пакета вплоть до 32 768 (!). Правда и рост производительности вставки на этом остановился. Причем безо всяки превышений числа контекстов. Загадка природы, но в исходники лезть пока что не хочется.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655076
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

никаких загадок, многократно выполненный EXEC BLOCK.
Трейс в помощь, если исходники смотреть лень.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655089
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Я как бы догадался про многократный. Вопросы вызывают размеры (число размноженных инсертов) в каждом таком многократном. Первоначальное страшное подозрение об ограничении в 256, почему-то не подтвердилось. Впрочем, ладно, проехали, я вижу мы по-прежнему каждый о своем.))
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655128
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FПервоначальное страшное подозрение об ограничении в 256, почему-то не подтвердилось.

Тот случай, когда неестественный интеллект побеждает и игнорирует указания естественного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655225
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Умничать все мы можем, а по существу есть что-нибудь? Почему контексты не переполнились?
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655229
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

потому что FireDac обманывает. В реальности он твои 32768 на несколько EXECUTE BLOCK в которых всего 255 операторов.
Так что смысла ставить батчи размером больше 255 нет.

З.Ы. Я в исходник глянул
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655231
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисVlad F,

потому что FireDac обманывает. В реальности он твои 32768 на несколько EXECUTE BLOCK в которых всего 255 операторов.
Но ведь при выборе подобной стратегии-обманки нескольких вроде бы и не нужно. Достаточно соорудить один, пусть даже всего на 256 операндов, потом просто перезакладывать параметры и пускать его повторно нужное число раз.
Так что смысла ставить батчи размером больше 255 нет.
А ты уверен? Сам-то пробовал или только исходники курил? Завтра постараюсь таки опубликовать полученные результаты, сегодня просто времени не хватило.
З.Ы. Я в исходник глянул
Видимо это как раз тот редкий случай, когда исходники могут ввести в серьезное заблуждение касаемо ожидаемых результатов.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655240
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

там их 2. Потому что размер батча может не делится ровно на 255.
Ну и выигрыш от увеличения размера батча ты получаешь только потому что в FireDac он устроен так что батчи перепрепарируются целиком, при следующем выполнении.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655253
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисбатчи перепрепарируются целиком, при следующем выполненииУточни, плс
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655260
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

судя вот по этому куску именно так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
procedure TFDPhysFBCommand.DoExecuteFB2Batch(ATimes, AOffset: Integer;
  var ACount: TFDCounter);
var
  sBatchSQL: String;
  iBatchSize, iBatchSize2: LongWord;
  iInVarsCount, iOutVarsCount: Smallint;
  iCurTimes, iCurOffset, iLastBatchSize: Integer;
  oStmt: TIBStatement;
  oResOpts: TFDResourceOptions;
begin
  oResOpts := FOptions.ResourceOptions;
  // total size of XSQLVAR, which will be send to server in single packet
  iBatchSize := FStmt.MaximumBatchSize;

  // total count of XSQLVAR's. UPDATE OR INSERT command will use few times
  // more variables, than actually the command text has
  iInVarsCount := FStmt.InVars.VarCount;
  case GetCommandKind of
  skMerge:  iInVarsCount := iInVarsCount * 5;
  skUpdate: iInVarsCount := iInVarsCount * 3;
  end;
  iOutVarsCount := FStmt.OutVars.VarCount;

  // total size of SQL command, which will be send to server
  iBatchSize2 := 32700 div
    (Length(FDBCommandText) +
     iInVarsCount * 11 + 2 + iInVarsCount * (11 + 15 + 3) +
     iOutVarsCount * 11 + 2 + iOutVarsCount * (11 + 15 + 3));
  if iBatchSize2 < iBatchSize then
    iBatchSize := iBatchSize2;

  // maximum number of contexts
  if iBatchSize > 255 then
    iBatchSize := 255;

  if iBatchSize > LongWord(oResOpts.ArrayDMLSize) then
    iBatchSize := LongWord(oResOpts.ArrayDMLSize);

  // If block will have only single command, then go by standard
  // route - execute command once for each param array item.
  if iBatchSize <= 1 then begin
    DoExecute(ATimes, AOffset, ACount);
    Exit;
  end;

  iCurOffset := AOffset;
  iCurTimes := LongWord(AOffset) + iBatchSize;
  iLastBatchSize := 0;

  oStmt := TIBStatement.Create(IBConnection.IBDatabase,
    TFDPhysIBTransactionBase(FTransactionObj).IBTransaction, Self);
  try
    SetupStatement(oStmt);

    while iCurOffset < ATimes do begin
      if iCurTimes > ATimes then
        iCurTimes := ATimes;

      if iLastBatchSize <> iCurTimes - iCurOffset then begin
        sBatchSQL := GenerateFB2BatchSQL(iCurTimes, iCurOffset);
        oStmt.Unprepare;
        oStmt.Prepare(sBatchSQL);
        if FStmt.OutVars.VarCount > 0 then
          oStmt.DescribeSelect;
        FStmt.OutVars.RowCount := 1;
        if FStmt.InVars.VarCount > 0 then
          oStmt.DescribeBind;
        FStmt.InVars.RowCount := 1;
        iLastBatchSize := iCurTimes - iCurOffset;
      end;

      SetFB2BatchParamValues(oStmt, iCurTimes, iCurOffset);
      oStmt.Execute(True);
      GetFB2BatchParamValues(oStmt, iCurTimes, iCurOffset);
      Inc(ACount, oStmt.RowsAffected);
      oStmt.Close;

      Inc(iCurOffset, iBatchSize);
      Inc(iCurTimes, iBatchSize);
    end;

  finally
    FDFree(oStmt);
  end;
end;



т.е. внутри самого батча лишних препарирований вроде нет, а вот если его повторно выполнять то построение EXECUTE BLOCK и prepare будут делаться заново. Именно поэтому Vlad F получает выигрыш при батчах размером больше 255. Просто выгодней не делать этого лишние разы.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655262
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

спасибо, теперь понятно
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655342
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привожу результаты тестирования института Array DML (FireDAC) для запросов на вставку.
Тестовая рабочая станция: HP Compaq 8200 Elite CMT PC с дополненным до 8 Гб ОЗУ и оценкой производительности 5.1 по шкале Win7.
Windows 7 Prof x64.
FB 3.0.3.329x64 в режиме embedded. В конфиге изменение только в части Providers=Engine12.
Тестовая таблица-пробник: пара полей варчар(10), по одному типа дата и целое и дюжина нумериков(18,4). Вставляется миллион записей параметризированным запросом.
Показатели времени выполнения в зависимости от значений ArraySize (размерности массива пакетной вставки) в мин/сек, с коммитом после каждой пачки:
128 -> 03:21
256 -> 02:23
512 -> 01:26
1 024 -> 01:09
2 048 -> 01:01
4 096 -> 00:59
8 192 -> 00:54
16 384 -> 00:51
32 768 -> 00:50
Очевидно, что дальнейшее увеличение размер пакета не имеет смысла, а дополнительное возможное увеличение производительности лежит в области распараллеливания процесса вставки. В результате чего, вероятно, можно приблизится (и, не исключено, что и превзойти) озвученные kdv выше показатели "миллион за 25 секунд". Ну и резюмируя, хочу отметить, что FireDAC в целом показал себя с FB очень хорошо и при его штатном наличии в современных версиях среды разработки нет никакого смысла продолжать пользоваться IBX.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655352
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

Тебе даже конкретный код приводят, где батчсайз по 255 файрдаком режется, нет, всё равно тестишь 256.
...
Рейтинг: 0 / 0
Вставка в Firebird посредством Array DML (FireDAC)
    #39655361
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

попробуй потестить размер пакетов кратный 255. Я думаю там циферки получше выйдут
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вставка в Firebird посредством Array DML (FireDAC)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]