Kiểm tra INSERT/UPDATE/DELETE
Dưới đây bạn có thể tìm thấy một bài kiểm tra rất đơn giản (bằng SQL thuần túy) đo lường hiệu suất của các thao tác INSERT/UPDATE/DELETE trong Firebird (4.0, 3.0 và 2.5). Bài kiểm tra này là đơn luồng và kết quả của nó phụ thuộc chủ yếu vào phần cứng (tốc độ đĩa, CPU, RAM) và kích thước bộ nhớ cache của Firebird. Sử dụng bài kiểm tra này để nhanh chóng đánh giá phần cứng và hiệu suất Firebird của bạn và so sánh với các kết quả bên dưới: phần cứng tốt nên nằm trong 30% trên của bảng.
Vui lòng gửi đến [email protected] kết quả thực thi script kèm thông tin chi tiết về đĩa, CPU và RAM của bạn, và chúng tôi sẽ thêm vào bảng bên dưới.
Dưới đây là biểu đồ và tệp XLS với kết quả kiểm tra trên các loại đĩa, phiên bản Firebird và máy tính khác nhau:

Tải xuống tệp XLS với kết quả kiểm tra tại đây.
Script SQL kiểm tra
Để chạy bài kiểm tra, sao chép-dán văn bản bên dưới vào tệp văn bản và thay đổi đường dẫn đến cơ sở dữ liệu - trong ví dụ, chuỗi kết nối ở định dạng TCP Firebird 3, nhưng bạn có thể thay đổi nó thành chuỗi kết nối XNET (xnet://Disk:\path\database.fdb) hoặc nhúng (disk:\path\database.fdb).
Vui lòng sử dụng cùng firebird.conf như bạn thường dùng (nếu bạn cần điều chỉnh cấu hình, hãy sử dụng một trong các tệp cấu hình tối ưu hóa này).
Bài kiểm tra này tạo một cơ sở dữ liệu, 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.
Nếu bạn đã lưu tệp sql vào c:\temp\dml-basic-benchmark.sql, vui lòng chạy script này với lệnh sau:
isql -i c:\temp\dml-basic-benchmark.sql
Script này sẽ tạo một cơ sở dữ liệu có kích thước khoảng 3.6Gb. Đừng quên xóa nó sau khi kiểm tra.
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;