sqlite 의 새로운 대안 Berkeley DB

아이폰, 안드로이드폰에서 공통적으로 사용하는 DBMS 가 무엇이냐고 물으면, 조금이라도 아는 사람은

sqlite를 생각하게 됩니다. File 기반 DBMS 이고, 소스에 임베딩해서 사용할 수 있는, sql 문법까지 지원하는

DBMS는 그냥 sqlite 밖에 없었다고 생각하시면 됩니다.

그런데, 그에 대한 강력한 경쟁자가 떠올랐습니다. 그게 바로 Berkely DB입니다. -_- 이게 뭐야 하시는 분들이

바로 나오실 꺼 같은데, BDB는 예전부터 유명한 파일 기반 DB API였습니다. DBMS라고 부르지 않고 DB API로

부른 이유는 단순 Key Value Store 에 SQL 문법은 전혀 지원하지도 않았습니다.

 그런데 그런 BDB가 Oracle에 인수된 후… 그리고 Oracle Berkely DB 11g Release 2 라는 이름으로

2010년 8월 27일에 출시되었습니다. 벌써 5개월 정도 되었는데, 국내에는 그렇게 관련 정보가 없는듯 합니다.

그런데 이번에 SQL Interface 를 지원하고, ODBC, JDBC 등을 지원하는 최초의 버전이 나와버린겁니다. T.T

오오오 오라클을 찬양하라~~~

 거기다가 더더욱 엄청난 점은 -_- 기존에 sqlite3 로 빌드된 어플이라면 소스를 바꾸지 않고 라이브러리만

링크를 바꿔주면 빌드가 됩니다.( 이건 아예 상단부를 sqlite3 와 완전하게 동일하게 인터페이스를 설계했다고 합니다.

윗부분이 포팅된거일수도 있겠네요.) 그래서 dbsql 이라는 툴은 sqlite3 와 거의 동일합니다.

 실제로 libsqlite3 대신에 libdb_sql-5.1.a 를 링크해주자 -_- 그대로 돌아갑니다. 단 해당 기능을 사용하기 위해서는

빌드시에 sqlite3 헤더가 필요합니다.

그렇다면 이제 BDB와 sqlite3의 차이는 어떤점이 있을까요? BDB는 MVCC 라는 것을 지원합니다. Read 와 Write 의 경우에

Write 가 되더라도 Read를 정상적으로 할 수 있고, 그 반대도 할 수 있도록 처리해주는 기법입니다. 즉 동시에 여러개의

프로그램에서 BDB를 이용해서 insert, select, update 등을 행하더라도, 동시 처리 성능이 높아집니다. sqlite3의 경우에는

하나의 작업이 동작하면 다른 작업들은 전부 실패하게 됩니다. 단, 이런 기능으로 인해서 단일 스레드상의

단순 성능은 sqlite3가 높을듯 합니다. 해당 부분은 추후에 테스트 코드로 비교해보면 될듯 합니다.(같은 코드베이스에

빌드만 따로하면 되니 정확한 비교가 될듯 합니다. 뭐, 쿼리 실행 계획이 틀릴수도 있지만요 ) 그럼 BDB는 단점이 없느냐?

그런건 아닙니다. 만약 NFS 나 다른 프로토콜로 다른 서버에 있는 BDB 파일을 이용하려고 한다면, 위의 MVCC가 제대로

동작하지 않습니다. 현재 동기화 매커니즘이 하나의 머신안에서 여러 프로세스가 접근할 때 제어하는 형태로 구성되어

있기 때문입니다. 그러나 sqlite3의 경우는 File Lock 기반을 이용하므로, 여러 서버에서 동시에 접근하더라도, 성능은

떨어지지만, 제대로 된 동시성 제어가 되게 됩니다. BDB 쪽은 쫌 더 확인이 필요할듯 하네요.

 그래도 오늘 의외로 좋은 정보를 얻게 되어서 이렇게 정리해 둡니다.

 BDB 를 받으시면 안에 example의 sql 부분을 보시면 실제 sqlite3 함수를 그대로 쓰고 있다는 것을 알 수 있습니다.