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

단일 스레드 SQL 벤치마크로 Firebird 2.5, 3.0, 4.0에서 INSERT, UPDATE, DELETE 처리량을 측정합니다. 결과는 주로 디스크, CPU, RAM 및 Firebird 캐시 크기에 따라 달라집니다. 빠른 하드웨어 점검으로 사용하세요 - 우수한 하드웨어는 일반적으로 공개된 결과의 상위 30%에 해당합니다.

공개된 결과

다양한 디스크, Firebird 버전 및 컴퓨터에서의 INSERT/UPDATE/DELETE 테스트 결과
수집된 실행 결과 그래프. 전체 표: insert_update_delete_results.xls.

테스트 실행 방법

  1. 아래 SQL 스크립트를 파일로 복사합니다. 예: c:\temp\dml-basic-benchmark.sql (Linux: /tmp/dml-basic-benchmark.sql).
  2. 첫 번째 create database 줄에서 데이터베이스 경로를 변경합니다. 예제는 Firebird 3 TCP(localhost:e:\inserttest4.fdb)를 사용합니다. XNET(xnet://Disk:\path\database.fdb) 또는 임베디드(disk:\path\database.fdb)로 전환할 수 있습니다.
  3. 프로덕션에서 사용하는 것과 동일한 firebird.conf를 유지하세요. 먼저 튜닝하려면 최적화된 구성을 사용하세요.
  4. isql을 실행합니다 (일부 Linux 패키지에서는 isql-fb). 테스트는 여러 인덱스가 있는 테이블을 생성한 다음 100만 건의 INSERT, UPDATE, DELETE 작업을 수행합니다.
  5. 데이터베이스는 약 3.6 GB까지 커집니다 - 테스트 후 삭제하세요.

isql 명령

Windows

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

Linux

명령
isql -i /tmp/dml-basic-benchmark.sql

테스트 SQL 스크립트

.sql 파일로 복사한 다음 필요에 따라 연결 문자열과 SYSDBA 비밀번호를 편집하세요.

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;