powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC + DOA (Delphi)
11 сообщений из 11, страница 1 из 1
FireDAC + DOA (Delphi)
    #39603160
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу быстро записать 8 массивов по 500,000 элементов в Oracle.
Тестирую по одному набору из FireDAC и DOA.

В DOA оптимизировал как мог )) итог:
SetVariable = 828 мс
Execute = 969 мс

В FireDAC (первый день, не знаю где оптимизировать):
SetVariable = 781 мс
Execute = 4563 мс !!!!

Подскажите, какие настройки выставить в FireDAC?

Настройки DOA:
Код: pascal
1.
2.
3.
oraSession.ThreadSafe := True; //в отдельном потоке, но иногда выскакивает External exception EBF00BAA
oraSession.ConvertCRLF:= False; //у меня 3 массива строк [10] просто DOA не умеет передавать больше otInteger
oraSession.TrimStringFields:= False;
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39603232
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПодскажите, какие настройки выставить в FireDAC?Может, Вам стоит начать с публикации кода?
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39603260
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Код: 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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, OracleCI, Oracle, Vcl.StdCtrls,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
  FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,
  FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, FireDAC.Phys.OracleDef, FireDAC.Phys.Oracle;

type
  TobPack = class (Tobject)
    mSRC_ADDR: Variant;
    mDST_ADDR: Variant;
    mNAT_SRC: Variant;
    mSRC_PORT: Variant;
    mDST_PORT: Variant;
    mNAT_PORT:Variant;
    mDate: Variant;
    mDateEnd: Variant;
    cnt_pack: integer;
    constructor Create(const dbSize: integer); overload;
    destructor Destroy; override;
  end;

  type
  TobPack1 = class (Tobject)
    mSRC_ADDR: array of int64;
    mDST_ADDR: array of int64;
    mNAT_SRC: array of int64;
    mSRC_PORT: array of integer;
    mDST_PORT: array of integer;
    mNAT_PORT: array of integer;
    mDate: array of TDateTime;
    mDateEnd: array of TDateTime;
    cnt_pack: integer;
    constructor Create(const dbSize: integer); overload;
    destructor Destroy; override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    OraSession: TOracleSession;
    ods: TOracleQuery;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    Label4: TLabel;
    FDConnection: TFDConnection;
    FDQuery: TFDQuery;
    FDPhysOracleDriverLink1: TFDPhysOracleDriverLink;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  size_pack: integer = 500000;
  ob: TobPack;
  ob1: TobPack1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  fStartNew: Cardinal;
begin
  fStartNew:= GetTickCount;
  ods.Close;
  ods.SetVariable(0, ob.mDate);
  ods.SetVariable(1, ob.mDateEnd);
  ods.SetVariable(2, ob.mSRC_ADDR);
  ods.SetVariable(3, ob.mNAT_SRC);
  ods.SetVariable(4, ob.mDST_ADDR);
  ods.SetVariable(5, ob.mSRC_PORT);
  ods.SetVariable(6, ob.mNAT_PORT);
  ods.SetVariable(7, ob.mDST_PORT);
  ods.SetVariable(8, ob.cnt_pack);
  label1.caption:= 'Заполнено за:' + inttostr(GetTickCount - fStartNew);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fStartNew: Cardinal;
begin
   fStartNew:= GetTickCount;
                ods.Execute;
   label2.caption:= 'выполнено за:' + inttostr(GetTickCount - fStartNew);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  fStartNew: Cardinal;
  i: integer;
begin
  fStartNew:= GetTickCount;
  FDQuery.Close;

  FDQuery.ParamByName('v_cnt').Value:= size_pack;


  for i := 0 to size_pack-1 do
  begin
    FDQuery.Params[0].Values[i]:= ob.mDate[i];
    FDQuery.Params[1].Values[i]:= ob.mDateEnd[i];
    FDQuery.Params[2].Values[i]:= ob.mSRC_ADDR[i];
    FDQuery.Params[3].Values[i]:= ob.mNAT_SRC[i];
    FDQuery.Params[4].Values[i]:= ob.mDST_ADDR[i];
    FDQuery.Params[5].Values[i]:= ob.mSRC_PORT[i];
    FDQuery.Params[6].Values[i]:= ob.mNAT_PORT[i];
    FDQuery.Params[7].Values[i]:= ob.mDST_PORT[i];
  end;

  label3.caption:= 'Заполнено за:' + inttostr(GetTickCount - fStartNew);

end;

procedure TForm1.Button4Click(Sender: TObject);
var
  fStartNew: Cardinal;
begin
  fStartNew:= GetTickCount;
  FDQuery.ExecSQL;
  label4.caption:= 'выполнено за:' + inttostr(GetTickCount - fStartNew);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ob.Free;
  ob1.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  i: integer;
  ora_path, STT: string;
  SRC_ADDR, NAT_SRC, DST_ADDR: string;
  SRC, NAT, DST: uint32;
begin

  oraSession.Preferences.ConvertCRLF:= false;
  oraSession.Preferences.TrimStringFields:= false;

  OracleCI.OCIDLL:='c:\ProgramData\_ORACLE\oci.dll';
  ora_path:= 'c:\ProgramData\_ORACLE\';
   SetEnvironmentVariable('TNS_ADMIN',pchar(ora_path));

      stt:=GetEnvironmentVariable('PATH');
      stt:=ora_path+';'+stt;
      SetEnvironmentVariable('PATH',pchar(stt));
      stt:=GetEnvironmentVariable('PATH');

    oraSession.LogOn;


      ods:= TOracleQuery.create(nil);

        with ods do
        begin
           Session:= oraSession;
           DeleteVariables;
           sql.Text:='хранимая процедура';

           DeclareVariable('mDate', otDate);
           DimPLSQLTable('mDate', size_pack, 0);
           DeclareVariable('mDateEnd', otDate);
           DimPLSQLTable('mDateEnd', size_pack, 0);
           DeclareVariable('mSRC_ADDR', otString);
           DimPLSQLTable('mSRC_ADDR', size_pack, 10);
           DeclareVariable('mNAT_SRC', otString);
           DimPLSQLTable('mNAT_SRC', size_pack, 10);
           DeclareVariable('mDST_ADDR', otString);
           DimPLSQLTable('mDST_ADDR', size_pack, 10);
           DeclareVariable('mSRC_PORT', otInteger);
           DimPLSQLTable('mSRC_PORT', size_pack, 0);
           DeclareVariable('mSRC_TRANS_PORT', otInteger);
           DimPLSQLTable('mSRC_TRANS_PORT', size_pack, 0);
           DeclareVariable('mDST_PORT', otInteger);
           DimPLSQLTable('mDST_PORT', size_pack, 0);
           DeclareVariable('v_cnt', otInteger);
           Optimize:= True; //не будет пересобирать заново запрос

        end;

  FDPhysOracleDriverLink1.NLSLang:= 'AMERICAN_AMERICA.CL8MSWIN1251';
  FDPhysOracleDriverLink1.TNSAdmin:= ora_path;
  FDPhysOracleDriverLink1.VendorHome:= ora_path;
  FDPhysOracleDriverLink1.VendorLib:= 'c:\ProgramData\_ORACLE\oci.dll';

  FDConnection.Params.UserName:= 'inter';
  FDConnection.Params.Password:= 'ghjtrn';
  FDConnection.Params.Database:= 'ORA_15';
  FDConnection.Params.DriverID:= 'Ora';

  FDConnection.Open;

   FDQuery.Connection := FDConnection;
     // FDQuery.ResourceOptions.CmdExecTimeout:= quTimeOut;
      FDQuery.ResourceOptions.CmdExecMode := amBlocking;
      FDQuery.SQL.Text:=  'хранимая процедура';

      FDQuery.ParamByName('mDate').ArrayType:= atTable;
      FDQuery.ParamByName('mDate').ArraySize:= size_pack;
      FDQuery.ParamByName('mDate').DataType:= ftDateTime;

      FDQuery.ParamByName('mDateEnd').ArrayType:= atTable;
      FDQuery.ParamByName('mDateEnd').ArraySize:= size_pack;
      FDQuery.ParamByName('mDateEnd').DataType:= ftDateTime;

      FDQuery.ParamByName('mSRC_ADDR').ArrayType:= atTable;
      FDQuery.ParamByName('mSRC_ADDR').ArraySize:= size_pack;
      FDQuery.ParamByName('mSRC_ADDR').DataType:= ftString;
      FDQuery.ParamByName('mSRC_ADDR').Size:= 10;

      FDQuery.ParamByName('mNAT_SRC').ArrayType:= atTable;
      FDQuery.ParamByName('mNAT_SRC').ArraySize:= size_pack;
      FDQuery.ParamByName('mNAT_SRC').DataType:= ftString;
      FDQuery.ParamByName('mNAT_SRC').Size:= 10;

      FDQuery.ParamByName('mDST_ADDR').ArrayType:= atTable;
      FDQuery.ParamByName('mDST_ADDR').ArraySize:= size_pack;
      FDQuery.ParamByName('mDST_ADDR').DataType:= ftString;
      FDQuery.ParamByName('mDST_ADDR').Size:= 10;

      FDQuery.ParamByName('mSRC_PORT').ArrayType:= atTable;
      FDQuery.ParamByName('mSRC_PORT').ArraySize:= size_pack;
      FDQuery.ParamByName('mSRC_PORT').DataType:= ftInteger;

      FDQuery.ParamByName('mSRC_TRANS_PORT').ArrayType:= atTable;
      FDQuery.ParamByName('mSRC_TRANS_PORT').ArraySize:= size_pack;
      FDQuery.ParamByName('mSRC_TRANS_PORT').DataType:= ftInteger;

      FDQuery.ParamByName('mDST_PORT').ArrayType:= atTable;
      FDQuery.ParamByName('mDST_PORT').ArraySize:= size_pack;
      FDQuery.ParamByName('mDST_PORT').DataType:= ftInteger;
      FDQuery.ParamByName('v_cnt').DataType:= ftInteger;

      FDQuery.Prepare; {подготовить}




   ob:= TobPack.Create(size_pack);
   SRC_ADDR:= '1111111111';
   NAT_SRC:= '3333333333';
   DST_ADDR:= '2222222222';
   for i := 0 to size_pack-1 do
   begin
    ob.mSRC_ADDR[i] := SRC_ADDR;
    ob.mSRC_PORT[i] := 1111;
    ob.mNAT_SRC[i] := NAT_SRC;
    ob.mNAT_PORT[i] := 3333;
    ob.mDST_ADDR[i] := DST_ADDR;
    ob.mDST_PORT[i] := 2222;
    ob.mDate[i] := now;
    ob.mDateEnd[i] := now+1;
   end;

   ob1:= TobPack1.Create(size_pack);
   SRC:= 1111111111;
   NAT:= 9999999999;
   DST:= 2222222222;
   for i := 0 to size_pack-1 do
   begin
    ob1.mSRC_ADDR[i] := SRC;
    ob1.mSRC_PORT[i] := 1111;
    ob1.mNAT_SRC[i] := NAT;
    ob1.mNAT_PORT[i] := 3333;
    ob1.mDST_ADDR[i] := DST;
    ob1.mDST_PORT[i] := 2222;
    ob1.mDate[i] := now;
    ob1.mDateEnd[i] := now+1;
   end;
end;

{ TobPack }

constructor TobPack.Create(const dbSize: integer);
begin
  inherited Create;

    mSRC_ADDR := VarArrayCreate([0, dbSize-1], varOleStr);
    mDST_ADDR := VarArrayCreate([0, dbSize-1], varOleStr);
    mNAT_SRC:= VarArrayCreate([0, dbSize-1], varOleStr);
    mSRC_PORT:= VarArrayCreate([0, dbSize-1], varInteger);
    mDST_PORT:= VarArrayCreate([0, dbSize-1], varInteger);
    mNAT_PORT:= VarArrayCreate([0, dbSize-1], varInteger);
    mDate:= VarArrayCreate([0, dbSize-1], varDate);
    mDateEnd:= VarArrayCreate([0, dbSize-1], varDate);

end;

destructor TobPack.Destroy;
begin
  mSRC_ADDR := null;
  mDST_ADDR := null;
  mNAT_SRC:= null;
  mSRC_PORT:= null;
  mDST_PORT:= null;
  mNAT_PORT:= null;
  mDate:= Null;
  mDateEnd:= Null;


  inherited;
end;

{ TobPack1 }

constructor TobPack1.Create(const dbSize: integer);
begin
   inherited create;
    SetLength(mSRC_ADDR, dbSize);
    SetLength(mDST_ADDR, dbSize);
    SetLength(mNAT_SRC, dbSize);
    SetLength(mSRC_PORT, dbSize);
    SetLength(mNAT_PORT, dbSize);
    SetLength(mDST_PORT, dbSize);
    SetLength(mDate, dbSize);
    SetLength(mDateEnd, dbSize);
end;

destructor TobPack1.Destroy;
begin
  SetLength(mSRC_ADDR, 0);
  SetLength(mDST_ADDR, 0);
  SetLength(mNAT_SRC, 0);
  SetLength(mSRC_PORT, 0);
  SetLength(mNAT_PORT, 0);
  SetLength(mDST_PORT, 0);
  SetLength(mDate, 0);
  SetLength(mDateEnd, 0);
  inherited;
  inherited;
end;

end.

...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39603489
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне на Informix помогло отключение fiMeta в FetchOptions и ReadOnly=true - скорость выросла многократно. Плюс есть возможность задавать параметры, как массивы и загонять данные большими кусками (array dml вроде называется).
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39603915
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010, эти опции не помогают (( ArrayDML в этих случаях не подходит
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39604156
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слишком "разный" код для DOA и FireDAC. ob.cnt_pack где-то заполняется ? Попробуй почистить код и сделать его максимально унифицированным по структуре, удалить лишний код и тд.
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39604521
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev, ob.cntPack в данном случае это size_pack.
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39604523
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как можно аварийно завершить запрос в FireDac? В DOA есть метод OracleSession.BreakExecution, а в FireDAC есть что-то такое?
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39604529
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TFDQuery.AbortJob
...
Рейтинг: 0 / 0
FireDAC + DOA (Delphi)
    #39604924
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev, спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FireDAC + DOA (Delphi)
    #40138507
YSuhoparov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Компонет TOracleDataSet DOA при изменении текста запроса держит открытым пред. датасет
TFDQuery (FireDac) сразу закрывает датасет,
обновить данные можно только методом Open()
Как настроить TFDQuery. чтобы он не закрывал запрос
и позволял выполнить refresh() ?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC + DOA (Delphi)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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