Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. 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;