source upload
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
program mORMotBatchInsert;
|
||||
|
||||
// see http://stackoverflow.com/a/31523392/458259
|
||||
|
||||
{$APPTYPE CONSOLE}
|
||||
|
||||
uses
|
||||
{$I SynDprUses.inc} // includes FastMM4
|
||||
SysUtils,
|
||||
SynCommons,
|
||||
mORMot,
|
||||
mORMotSQLite3,
|
||||
SynSQLite3,
|
||||
SynSQLite3Static;
|
||||
|
||||
type
|
||||
TSQLIndy = class(TSQLRecord)
|
||||
private
|
||||
fdied: boolean;
|
||||
fhasdata: boolean;
|
||||
feventlinesneedprocessing: boolean;
|
||||
ftodo: integer;
|
||||
ffams: integer;
|
||||
flinkinfo: integer;
|
||||
ffirstancestralloop: integer;
|
||||
ffamc: integer;
|
||||
fnextreportindi: integer;
|
||||
fdeathdate: string;
|
||||
fchanged: string;
|
||||
fbirthdate: string;
|
||||
feventlines: string;
|
||||
fgedcomnames: string;
|
||||
fsex: string;
|
||||
findikey: string;
|
||||
published
|
||||
property indikey: string read findikey write findikey;
|
||||
property hasdata: boolean read fhasdata write fhasdata;
|
||||
property gedcomnames: string read fgedcomnames write fgedcomnames;
|
||||
property sex: string read fsex write fsex;
|
||||
property birthdate: string read fbirthdate write fbirthdate;
|
||||
property died: boolean read fdied write fdied;
|
||||
property deathdate: string read fdeathdate write fdeathdate;
|
||||
property changed: string read fchanged write fchanged;
|
||||
property eventlinesneedprocessing: boolean read feventlinesneedprocessing write feventlinesneedprocessing;
|
||||
property eventlines: string read feventlines write feventlines;
|
||||
property famc: integer read ffamc write ffamc;
|
||||
property fams: integer read ffams write ffams;
|
||||
property linkinfo: integer read flinkinfo write flinkinfo;
|
||||
property todo: integer read ftodo write ftodo;
|
||||
property nextreportindi: integer read fnextreportindi write fnextreportindi;
|
||||
property firstancestralloop: integer read ffirstancestralloop write ffirstancestralloop;
|
||||
end;
|
||||
|
||||
const COUNT = 1000000;
|
||||
|
||||
{
|
||||
Prepared 1000000 rows in 603.28ms
|
||||
Inserted 1000000 rows in 5.79s
|
||||
}
|
||||
|
||||
procedure Test;
|
||||
var db: TSQLRestServerDB;
|
||||
batch: TSQLRestBatch;
|
||||
i: Integer;
|
||||
indy: TSQLIndy;
|
||||
timer: TPrecisionTimer;
|
||||
begin
|
||||
DeleteFile('test.db3');
|
||||
db := TSQLRestServerDB.CreateWithOwnModel([TSQLIndy],'test.db3');
|
||||
try
|
||||
db.DB.LockingMode := lmExclusive;
|
||||
db.DB.Synchronous := smOff;
|
||||
db.CreateMissingTables;
|
||||
timer.Start;
|
||||
batch := TSQLRestBatch.Create(db,TSQLIndy,10000);
|
||||
try
|
||||
indy := TSQLIndy.Create;
|
||||
try
|
||||
for i := 1 to COUNT do begin
|
||||
indy.indikey := IntToString(i);
|
||||
indy.hasdata := i and 1=0;
|
||||
indy.sex := 'Male';
|
||||
indy.famc := i;
|
||||
indy.fams := i*10;
|
||||
indy.todo := i+100;
|
||||
indy.firstancestralloop := i*2;
|
||||
batch.Add(indy,true);
|
||||
end;
|
||||
finally
|
||||
indy.Free;
|
||||
end;
|
||||
writeln('Prepared ',COUNT,' rows in ',timer.Stop);
|
||||
timer.Start;
|
||||
db.BatchSend(batch);
|
||||
write('Inserted ',COUNT,' rows in ',timer.Stop);
|
||||
writeln(' i.e. ',timer.PerSec(COUNT),' per second');
|
||||
finally
|
||||
batch.Free;
|
||||
end;
|
||||
finally
|
||||
db.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
const COUNT2 = 100000;
|
||||
|
||||
procedure Test2;
|
||||
var db: TSQLRestClientDB;
|
||||
res: TIDDynArray;
|
||||
i: Integer;
|
||||
indy: TSQLIndy;
|
||||
timer: TPrecisionTimer;
|
||||
begin
|
||||
DeleteFile('test2.db3');
|
||||
db := TSQLRestClientDB.Create(TSQLModel.Create([TSQLIndy]),nil,'test2.db3',TSQLRestServerDB);
|
||||
try
|
||||
db.Model.Owner := db;
|
||||
db.DB.LockingMode := lmExclusive;
|
||||
db.DB.Synchronous := smOff;
|
||||
db.Server.CreateMissingTables;
|
||||
timer.Start;
|
||||
db.BatchStart(TSQLIndy);
|
||||
indy := TSQLIndy.Create;
|
||||
try
|
||||
for i := 1 to COUNT2 do begin
|
||||
indy.indikey := IntToString(i);
|
||||
indy.hasdata := i and 1=0;
|
||||
indy.sex := 'Male';
|
||||
indy.famc := i;
|
||||
indy.fams := i*10;
|
||||
indy.todo := i+100;
|
||||
indy.firstancestralloop := i*2;
|
||||
db.BatchAdd(indy,true);
|
||||
end;
|
||||
finally
|
||||
indy.Free;
|
||||
end;
|
||||
writeln('Prepared ',COUNT2,' rows in ',timer.Stop);
|
||||
timer.Start;
|
||||
db.BatchSend(res);
|
||||
write('Inserted ',COUNT2,' rows in ',timer.Stop);
|
||||
writeln(' i.e. ',timer.PerSec(COUNT2),' per second');
|
||||
finally
|
||||
db.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
try
|
||||
Test;
|
||||
// Test2
|
||||
readln;
|
||||
except
|
||||
on E: Exception do
|
||||
ConsoleShowFatalException(E);
|
||||
end;
|
||||
end.
|
||||
|
Reference in New Issue
Block a user