Monday, 24 August 2015

Mempercepat Pengolahan SQL dengan Array DML

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.
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

Install Fortesreport community Delphi 7 dan RX Berlin

Download  Pertama2 kita harus punya file installernya terlebih dahulu, download  https://github.com/fortesinformatica/fortesrepo...