INSERT/UPDATE/DELETE-Test
Nachfolgend finden Sie einen sehr einfachen Test (in reinem SQL), der die Leistung von INSERT/UPDATE/DELETE-Operationen in Firebird (4.0, 3.0 und 2.5) misst. Dieser Test ist single-threaded, und sein Ergebnis hängt hauptsächlich von der Hardware (Festplattengeschwindigkeit, CPU, RAM) und der Firebird-Cache-Größe ab. Verwenden Sie diesen Test, um Ihre Hardware und Firebird-Leistung schnell zu bewerten und mit den untenstehenden Ergebnissen zu vergleichen: Gute Hardware sollte in den oberen 30 % der Tabelle liegen.
Bitte senden Sie an [email protected] das Ergebnis der Skriptausführung mit Details zu Ihrer Festplatte, CPU und RAM, und wir werden es zur untenstehenden Tabelle hinzufügen.
Hier ist das Diagramm und die XLS mit Testergebnissen auf verschiedenen Festplatten, Firebird-Versionen und Computern:

XLS-Datei mit Testergebnissen hier herunterladen.
Test-SQL-Skript
Um den Test auszuführen, kopieren Sie den untenstehenden Text in eine Textdatei und ändern Sie den Pfad zur Datenbank - im Beispiel ist die Verbindungszeichenfolge im Firebird-3-TCP-Format, aber Sie können sie in XNET (xnet://Disk:\path\database.fdb) oder eingebettete (disk:\path\database.fdb) Verbindungszeichenfolge ändern.
Bitte verwenden Sie dieselbe firebird.conf wie normal (wenn Sie Ihre Konfiguration optimieren müssen, verwenden Sie eine dieser optimierten Konfigurationsdateien).
Dieser Test erstellt eine Datenbank, erstellt eine Tabelle mit mehreren Indizes und führt dann 1 Million INSERT-, UPDATE- und DELETE-Operationen durch.
Wenn Sie die SQL-Datei unter c:\temp\dml-basic-benchmark.sql gespeichert haben, führen Sie dieses Skript mit dem folgenden Befehl aus:
isql -i c:\temp\dml-basic-benchmark.sql
Dieses Skript erstellt eine Datenbank mit einer Größe von ungefähr 3,6 GB. Vergessen Sie nicht, sie nach dem Test zu löschen.
create database "localhost:e:\inserttest4.fdb" user "SYSDBA" password "masterkey" page_size 16384;
set term ^;
execute block as
begin
-- ######################################################
rdb$set_context('USER_SESSION', 'ROWS_TO_HANDLE', 1000000);
-- ######################################################
execute statement 'drop sequence g';
when any do
begin
end
end
^
set term ;^
commit;
create sequence g;
recreate table test(
id int
,grp smallint
,pid int
,dts timestamp
,code_sml varchar(15)
,code_med varchar(150)
,code_lrg varchar(1500)
,code_unq char(16) character set octets
,constraint test_pk primary key(id)
,constraint test_unq unique( code_unq )
);
create index test_pid on test(pid);
create descending index test_dts on test(dts);
create index test_dml on test(code_sml);
create index test_med on test(code_med);
create index test_lrg on test(code_lrg);
commit;
----------------------------------------------
set bail on;
set list on;
set stat on;
set term ^;
execute block returns( inserted_rows int, elap_ms int )
as
declare i int = 0;
declare t timestamp;
begin
inserted_rows = rdb$get_context('USER_SESSION', 'ROWS_TO_HANDLE');
t = 'now';
while ( i < inserted_rows ) do
begin
insert into test(id, grp, pid, dts, code_sml, code_med, code_lrg, code_unq)
values(
gen_id(g,1)
,rand() * 10
,rand() * 1000
,dateadd( rand()*1000000 second to timestamp '01.01.2019 00:00:00' )
,lpad('', 15, 'QWERTY' )
,lpad('', 150, 'QWERTY' )
,lpad('', 1500, 'QWERTY' )
,gen_uuid()
);
i = i + 1;
end
elap_ms = datediff(millisecond from t to cast('now' as timestamp));
suspend;
end
^
commit^
-----------------------------------------------
execute block returns( updated_rows int, elap_ms int )
as
declare i int = 0;
declare t timestamp;
begin
updated_rows = rdb$get_context('USER_SESSION', 'ROWS_TO_HANDLE');
t = 'now';
while ( i < updated_rows ) do
begin
update test set
grp = rand() * 10
,pid = rand() * 1000
,dts = dateadd( rand()*100000 second to timestamp '01.01.2019 00:00:00' )
,code_sml = lpad('', 15, 'ASDFGH' )
,code_med = lpad('', 150, 'ASDFGH' )
,code_lrg = lpad('', 1500, 'ASDFGH' )
,code_unq = gen_uuid()
where id = :i+1 ;
i = i + 1;
end
elap_ms = datediff(millisecond from t to cast('now' as timestamp));
suspend;
end
^
commit^
-----------------------------------------------
execute block returns( deleted_rows int, elap_ms int )
as
declare i int = 0;
declare t timestamp;
begin
deleted_rows = rdb$get_context('USER_SESSION', 'ROWS_TO_HANDLE');
t = 'now';
while ( i < deleted_rows ) do
begin
delete from test where id = :i+1 ;
i = i + 1;
end
elap_ms = datediff(millisecond from t to cast('now' as timestamp));
suspend;
end
^
set term ;^
commit;