Diese Seite wurde maschinell übersetzt. Lesen Sie das englische Original. English

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.

So führen Sie den Test aus »

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:

Testergebnisse INSERT/UPDATE/DELETE-Test

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:

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

Code
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;