Esta página foi traduzida por máquina. Leia o original em inglês. English

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.

Veja como executar o teste »

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:

Resultados do teste INSERT/UPDATE/DELETE

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:

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

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;