Teste de INSERT/UPDATE/DELETE
Abaixo você pode encontrar um teste muito simples (em SQL puro) que mede o desempenho das operações INSERT/UPDATE/DELETE no Firebird (4.0, 3.0 e 2.5). Este teste é single-threaded, e seu resultado depende principalmente do hardware (velocidade do disco, CPU, RAM) e do tamanho do cache do Firebird. Use este teste para avaliar rapidamente seu hardware e o desempenho do Firebird e compare com os resultados abaixo: um bom hardware deve estar nos 30% superiores da tabela.
Por favor, envie para [email protected] o resultado da execução do script com detalhes sobre seu disco, CPU e RAM, e nós o adicionaremos à tabela abaixo.
Aqui está o gráfico e o arquivo XLS com os resultados dos testes em diferentes discos, versões do Firebird e computadores:

Baixe o arquivo XLS com os resultados dos testes aqui.
Script SQL do teste
Para executar o teste, copie e cole o texto abaixo em um arquivo de texto e altere o caminho para o banco de dados - no exemplo, a string de conexão está no formato TCP do Firebird 3, mas você pode alterá-la para XNET (xnet://Disk:\path\database.fdb) ou conexão incorporada (disk:\path\database.fdb).
Use o mesmo firebird.conf que você usa normalmente (se precisar ajustar sua configuração, use um destes arquivos de configuração otimizados).
Este teste cria um banco de dados, cria uma tabela com vários índices e, em seguida, executa 1 milhão de operações INSERT, UPDATE e DELETE.
Se você salvou o arquivo SQL em c:\temp\dml-basic-benchmark.sql, execute este script com o seguinte comando:
isql -i c:\temp\dml-basic-benchmark.sql
Este script criará um banco de dados com aproximadamente 3,6 GB. Não se esqueça de excluí-lo após o teste.
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;