Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Một benchmark SQL đơn luồng đo lường thông lượng INSERT, UPDATE và DELETE trên Firebird 2.5, 3.0 và 4.0. Kết quả phụ thuộc chủ yếu vào ổ đĩa, CPU, RAM và kích thước bộ nhớ cache của Firebird. Sử dụng nó như một kiểm tra phần cứng nhanh - phần cứng tốt thường nằm trong 30% kết quả công bố hàng đầu.

Kết quả đã công bố

Kết quả kiểm tra INSERT/UPDATE/DELETE trên các ổ đĩa, phiên bản Firebird và máy tính khác nhau
Biểu đồ các lần chạy thu thập được. Bảng đầy đủ: insert_update_delete_results.xls.

Cách chạy bài kiểm tra

  1. Sao chép script SQL bên dưới vào một tệp, ví dụ c:\temp\dml-basic-benchmark.sql (Linux: /tmp/dml-basic-benchmark.sql).
  2. Thay đổi đường dẫn cơ sở dữ liệu trong dòng create database đầu tiên. Ví dụ sử dụng Firebird 3 TCP (localhost:e:\inserttest4.fdb). Bạn có thể chuyển sang XNET (xnet://Disk:\path\database.fdb) hoặc nhúng (disk:\path\database.fdb).
  3. Giữ nguyên firebird.conf mà bạn sử dụng trong sản xuất. Để tinh chỉnh trước, hãy sử dụng cấu hình tối ưu.
  4. Chạy isql (trên một số gói Linux: isql-fb). Bài kiểm tra tạo một bảng với nhiều chỉ mục, sau đó thực hiện 1 triệu thao tác INSERT, UPDATE và DELETE.
  5. Cơ sở dữ liệu phát triển lên khoảng 3.6 GB - hãy xóa nó sau khi kiểm tra.

Lệnh isql

Windows

Lệnh
isql -i c:\temp\dml-basic-benchmark.sql

Linux

Lệnh
isql -i /tmp/dml-basic-benchmark.sql

Script SQL kiểm tra

Sao chép vào một tệp .sql, sau đó chỉnh sửa chuỗi kết nối và mật khẩu SYSDBA nếu cần.

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;