Interbase and Oracle tested
Array DML di FireDAC membantu Anda mengambil keuntungan dari mesin database yang mendukung fitur ini dengan mudah. Untuk melihat perbedaan dalam kode dan kecepatan, memungkinkan mengeksplorasi contoh sederhana. Contoh menggunakan tabel berikut disebut tes yang berisi dua bidang, Integer dan String.
Array DML di FireDAC membantu Anda mengambil keuntungan dari mesin database yang mendukung fitur ini dengan mudah. Untuk melihat perbedaan dalam kode dan kecepatan, memungkinkan mengeksplorasi contoh sederhana. Contoh menggunakan tabel berikut disebut tes yang berisi dua bidang, Integer dan String.
CREATE TABLE test(Field1 INTEGER, field2 VARCHAR(20))
Cara khas untuk menyisipkan 10000 catatan adalah dengan menggunakan loop, di mana kita memiliki permintaan yang hanya update parameter dan mengeksekusi SQL.
const
NUM_INSERTS = 10000;
procedure TForm7.Button1Click(Sender: TObject);
var i: integer; t: integer;
begin
FDQuery1.ExecSQL('DELETE FROM test');
FDQuery1.SQL.Text := 'INSERT INTO test(field1, field2) values (:field1, :field2)';
t := GetTickCount;
FDQuery1.Connection.StartTransaction;
try
for i := 0 to NUM_INSERTS-1 do
begin
FDQuery1.Params[0].AsInteger := i;
FDQuery1.Params[1].AsString := 'Str' + IntToStr(i);
FDQuery1.ExecSQL;
end;
finally
FDQuery1.Connection.Commit;
end;
(Sender as TButton).Caption := FloatToStr((GetTickCount() - t) / 1000);
end;
Untuk mengubah kode ini untuk menggunakan Array DML, ada sangat sedikit untuk melakukan. Pertama, sebelum menetapkan nilai parameter Anda dapat mengatur ukuran dari array yang ingin Anda masukkan. (Anda selalu dapat mengatur ini lebih tinggi yang diperlukan jika Anda tidak yakin)
Setelah ukuran array diatur, ada sedikit modifikasi dengan cara nilai-nilai parameter yang ditetapkan. FireDAC mendukung setter jamak untuk menetapkan setiap record dalam array dinamis.
Silahkan rubah kode diatas dengan kode dibawah ini.
procedure TForm7.Button2Click(Sender: TObject); var i: integer; t: integer; begin FDQuery1.ExecSQL('DELETE FROM test'); FDQuery1.SQL.Text := 'INSERT INTO test(field1, field2) values (:field1, :field2)'; t := GetTickCount; FDQuery1.Connection.StartTransaction; try FDQuery1.Params.ArraySize := NUM_INSERTS; for i := 0 to NUM_INSERTS-1 do begin FDQuery1.Params[0].AsIntegers[i] := i; FDQuery1.Params[1].AsStrings[i] := 'Str' + IntToStr(i); end; FDQuery1.Execute(NUM_INSERTS,0); finally FDQuery1.Connection.Commit; end; (Sender as TButton).Caption := FloatToStr((GetTickCount() - t) / 1000); end;
Jadi apa perbedaan pada run time? Pada PC saya (mesin virtual), menjalankan 10.000 sisipan mengambil 1,014 detik di blok pertama kode, dibandingkan dengan 0,125 detik dengan blok kedua kode.yaitu hanya 12% dari waktu pemrosesan yang asli dan lebih dari 8 kali lebih cepat!
Yang butuh dvd DelphiXE8 bisa japri saya di 085787677544
0 comments: