Эта страница переведена машинным переводом. Читайте английский оригинал. English

Ниже вы можете найти очень простой тест (на чистом SQL), который измеряет производительность операций INSERT/UPDATE/DELETE в Firebird (4.0, 3.0 и 2.5). Этот тест является однопоточным, и его результат в основном зависит от аппаратного обеспечения (скорость диска, CPU, RAM) и размера кэша Firebird. Используйте этот тест для быстрой оценки вашего оборудования и производительности Firebird и сравните с результатами ниже: хорошее оборудование должно быть в верхних 30% таблицы.

Смотрите, как запустить тест »

Пожалуйста, отправьте на [email protected] результат выполнения скрипта с деталями о вашем диске, CPU и RAM, и мы добавим его в таблицу ниже.

Вот график и XLS с результатами тестов на разных дисках, версиях Firebird и компьютерах:

Результаты теста INSERT/UPDATE/DELETE

Скачайте XLS-файл с результатами тестов здесь.

SQL-скрипт теста

Чтобы запустить тест, скопируйте текст ниже в текстовый файл и измените путь к базе данных - в примере строка подключения в формате Firebird 3 TCP, но вы можете изменить её на XNET (xnet://Disk:\path\database.fdb) или встроенную (disk:\path\database.fdb) строку подключения.

Пожалуйста, используйте тот же firebird.conf, что и обычно (если вам нужно настроить конфигурацию, используйте один из этих оптимизированных файлов конфигурации).

Этот тест создает базу данных, создает таблицу с несколькими индексами, а затем выполняет 1 миллион операций INSERT, UPDATE и DELETE.

Если вы сохранили SQL-файл в c:\temp\dml-basic-benchmark.sql, запустите этот скрипт следующей командой:

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

Этот скрипт создаст базу данных размером примерно 3,6 ГБ. Не забудьте удалить её после теста.

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;