Test INSERT/UPDATE/DELETE
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 :

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