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

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.

Xem cách chạy bài kiểm tra »

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:

Kết quả kiểm tra INSERT/UPDATE/DELETE

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:

Code
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.

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;