Esta página fue traducida automáticamente. Lee el original en inglés. English

A continuación encontrará una prueba muy sencilla (en SQL puro) que mide el rendimiento de las operaciones INSERT/UPDATE/DELETE en Firebird (4.0, 3.0 y 2.5). Esta prueba es de un solo hilo, y su resultado depende principalmente del hardware (velocidad del disco, CPU, RAM) y del tamaño de caché de Firebird. Utilice esta prueba para evaluar rápidamente su hardware y el rendimiento de Firebird y compárelo con los resultados a continuación: el buen hardware debería estar en el 30% superior de la tabla.

Vea cómo ejecutar la prueba »

Envíe a [email protected] el resultado de la ejecución del script con detalles sobre su disco, CPU y RAM, y lo añadiremos a la tabla a continuación.

Aquí está el gráfico y el XLS con los resultados de las pruebas en diferentes discos, versiones de Firebird y computadoras:

Resultados de la prueba INSERT/UPDATE/DELETE

Descargue el archivo XLS con los resultados de las pruebas aquí.

Script SQL de la prueba

Para ejecutar la prueba, copie y pegue el texto a continuación en un archivo de texto y cambie la ruta a la base de datos - en el ejemplo, la cadena de conexión está en formato TCP de Firebird 3, pero puede cambiarla a una cadena de conexión XNET (xnet://Disk:\path\database.fdb) o embebida (disk:\path\database.fdb).

Utilice el mismo firebird.conf que usa normalmente (si necesita ajustar su configuración, use uno de estos archivos de configuración optimizados).

Esta prueba crea una base de datos, crea una tabla con varios índices y luego realiza 1 millón de operaciones INSERT, UPDATE y DELETE.

Si ha guardado el archivo SQL en c:\temp\dml-basic-benchmark.sql, ejecute este script con el siguiente comando:

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

Este script creará una base de datos de aproximadamente 3.6 Gb. No olvide eliminarla después de la prueba.

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;