此页面为机器翻译。请阅读英文原文。 English

一个单线程 SQL 基准测试,用于衡量 Firebird 2.5、3.0 和 4.0 上的 INSERT、UPDATE 和 DELETE 吞吐量。结果主要取决于磁盘、CPU、RAM 和 Firebird 缓存大小。将其用作快速硬件检查 - 好的硬件通常能达到已发布结果的前 30%。

已发布的结果

各种磁盘、Firebird 版本和计算机上的 INSERT/UPDATE/DELETE 测试结果
收集的运行图表。完整表格:insert_update_delete_results.xls

如何运行测试

  1. 将下面的 SQL 脚本复制到一个文件中,例如 c:\temp\dml-basic-benchmark.sql(Linux:/tmp/dml-basic-benchmark.sql)。
  2. 在第一行 create database更改数据库路径。示例使用 Firebird 3 TCP(localhost:e:\inserttest4.fdb)。您可以切换到 XNET(xnet://Disk:\path\database.fdb)或嵌入式(disk:\path\database.fdb)。
  3. 保持与生产环境相同的 firebird.conf。若要先进行调优,请使用优化配置
  4. 运行 isql(在某些 Linux 软件包中:isql-fb)。测试会创建一个带有多个索引的表,然后执行 100 万次 INSERT、UPDATE 和 DELETE 操作。
  5. 数据库将增长到约 3.6 GB - 测试后请将其删除。

isql 命令

Windows

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

Linux

命令
isql -i /tmp/dml-basic-benchmark.sql

测试 SQL 脚本

复制到 .sql 文件中,然后根据需要编辑连接字符串和 SYSDBA 密码。

dml-basic-benchmark.sql
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;