Cette page a été traduite automatiquement. Lisez l'original en anglais. English

Vous trouverez ci-dessous un test très simple (en SQL pur) qui mesure les performances des opérations INSERT/UPDATE/DELETE dans Firebird (4.0, 3.0 et 2.5). Ce test est monothreadé, et son résultat dépend principalement du matériel (vitesse du disque, CPU, RAM) et de la taille du cache Firebird. Utilisez ce test pour évaluer rapidement votre matériel et les performances de Firebird, et comparez avec les résultats ci-dessous : un bon matériel devrait se situer dans les 30 % supérieurs du tableau.

Voir comment exécuter le test »

Veuillez envoyer à [email protected] le résultat de l’exécution du script avec des détails sur votre disque, CPU et RAM, et nous l’ajouterons au tableau ci-dessous.

Voici le graphique et le fichier XLS avec les résultats des tests sur différents disques, versions de Firebird et ordinateurs :

Résultats du test INSERT/UPDATE/DELETE

Téléchargez le fichier XLS avec les résultats des tests ici.

Script SQL du test

Pour exécuter le test, copiez-collez le texte ci-dessous dans un fichier texte et modifiez le chemin de la base de données - dans l’exemple, la chaîne de connexion est au format TCP Firebird 3, mais vous pouvez la changer en XNET (xnet://Disk:\path\database.fdb) ou en connexion embarquée (disk:\path\database.fdb).

Veuillez utiliser le même firebird.conf que vous utilisez normalement (si vous devez ajuster votre configuration, utilisez l’un de ces fichiers de configuration optimisés).

Ce test crée une base de données, crée une table avec plusieurs index, puis effectue 1 million d’opérations INSERT, UPDATE et DELETE.

Si vous avez enregistré le fichier SQL dans c:\temp\dml-basic-benchmark.sql, exécutez ce script avec la commande suivante :

Code
isql -i c:\temp\dml-basic-benchmark.sql

Ce script créera une base de données d’environ 3,6 Go. N’oubliez pas de la supprimer après le test.

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;