대상 환경은 이렇습니다
- Dell Inspiron 7373/i5 8세대 모델
- Windows 10 Home
- 대상 DB(모두 32비트 모델)
- PostgreSQL 10.6: libpq 사용
- FIrebird 3.0.3: OO API (C++) 사용
- SQLite3: #include <sqlite3.h> // ...... :P
(아직 뭔가를 만들어 open source로 만들어 내놓을 정도의 실력이 되지는 않으니 이런거라도......)
- Insertion 속도
- 1위: SQLite, in-memory database: 2초
- 2위: PostgreSQL, COPY: 5초
- 3위: PostgreSQL, bulk insert: 7초
- 4위: Firebird, bulk insert: 10초
- 5위: SQLite, 파일에 저장: 56초
- Disk I/O 관련
- Windows 커널 특성상 small I/O가 많아지면 disk에 부담이 너무 많이 가 bottleneck이 됨
- Bulk insert가 불가능한 SQLite 파일 저장 조건에서 disk I/O가 100%가 됨
- Firebird의 경우, PSQL을 사용하여 bulk insert를 구현하는 형태로, 다수의 레코드를 한번에 받아 디스크에 개별 INSERT 명령어를 사용하여 순차적으로 쓰는 형태로 구현되므로, SQLite급까지는 아니더라도 disk I/O가 높게 일어남(disk I/O 50%)
- Firebird의 경우 page size를 최소 8192이상으로 가져가는 것이 disk I/O 부하 감소에 도움이 됨
- Bulk insertion 관련
- Bulk insertion을 이용하여 insertion 속도를 올릴 수 있으나, 일정 수준 이상을 넘어서면 속도가 더이상 올라가지 않음. 이는 disk I/O와는 별개임
- Firebird: 10개 수준에서 최고속력을 보임(page size와 상관없음)
- Sotred procedure
- PostgreSQL: 40개 수준에서 최고속력을 보임
- PostgreSQL 관련
- COPY(원본: CSV 기반)가 규격외로 빠른 속력을 보임. 실제로 공식 메뉴얼에서도 bulk insertion에서는 COPY를 추천함
- libpq에서 insertion 데이터를 보낼때 데이터를 text와 binary 중 어느 형태로 보내도 소요 시간은 동일함
- 기타
- 각 DB에서 제공하는 직접 연결 인터페이스를 사용하는 것이 wrapper를 사용하는 것보다 훨씬 빠름. Firebird로 최초 테스트시, SOCI 적용시 59초가 소요되었으나 Firebird OO API로 동일 로직 구현시 20초대에서 완료됨
No comments:
Post a Comment