이 페이지는 기계 번역되었습니다. 영어 원본을 읽어보세요. English

아래에서 Firebird(4.0, 3.0, 2.5)의 INSERT/UPDATE/DELETE 작업 성능을 측정하는 매우 간단한 테스트(순수 SQL)를 확인할 수 있습니다. 이 테스트는 단일 스레드이며, 결과는 주로 하드웨어(디스크 속도, CPU, RAM)와 Firebird 캐시 크기에 따라 달라집니다. 이 테스트를 사용하여 하드웨어와 Firebird 성능을 빠르게 평가하고 아래 결과와 비교해 보세요: 좋은 하드웨어는 표의 상위 30%에 있어야 합니다.

테스트 실행 방법 보기 »

스크립트 실행 결과를 디스크, CPU, RAM에 대한 세부 정보와 함께 [email protected]으로 보내주시면 아래 표에 추가하겠습니다.

다음은 다양한 디스크, Firebird 버전 및 컴퓨터에서의 테스트 결과 그래프와 XLS 파일입니다:

테스트 결과 INSERT/UPDATE/DELETE 테스트

테스트 결과 XLS 파일 다운로드

테스트 SQL 스크립트

테스트를 실행하려면 아래 텍스트를 텍스트 파일에 복사하여 붙여넣고 데이터베이스 경로를 변경하세요 - 예제에서는 연결 문자열이 Firebird 3 TCP 형식이지만, XNET(xnet://Disk:\path\database.fdb) 또는 임베디드(disk:\path\database.fdb) 연결 문자열로 변경할 수 있습니다.

평소 사용하는 firebird.conf를 그대로 사용하세요 (구성을 튜닝해야 하는 경우, 다음 최적화된 구성 파일 중 하나를 사용하세요).

이 테스트는 데이터베이스를 생성하고, 여러 인덱스가 있는 테이블을 만든 다음, 100만 개의 INSERT, UPDATE, DELETE 작업을 수행합니다.

SQL 파일을 c:\temp\dml-basic-benchmark.sql에 저장했다면 다음 명령으로 스크립트를 실행하세요:

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

이 스크립트는 약 3.6GB 크기의 데이터베이스를 생성합니다. 테스트 후 삭제하는 것을 잊지 마세요.

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;