Kiểm tra INSERT/UPDATE/DELETE
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ố
Cách chạy bài kiểm tra
- 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). - 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). - Giữ nguyên
firebird.confmà 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. - 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. - 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
isql -i c:\temp\dml-basic-benchmark.sql
Linux
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.
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;