태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Adobe AIR는 DBMS엔진인 Sqlite를 내장하여 로컬에서도 데이터들을 DB화 시켜 읽고, 쓰기와 같은 데이터 관리를 효율적으로 할 수 있는 장점이 있습니다.

보통, 플래시플랫폼과 같이 Front-End 개발을 주로 하셨던 분의 경우엔, DB와 같이 Back-End단의 작업 수행 방법을 이해하기 어렵기 때문에, AIR 애플리케이션을 개발할 때 어려움이 있는 것 같습니다.

이번 글에서 다뤄볼 내용도, 저에게 메일이나 블로그를 통해 자주 질문하시는 내용 중 하나인데, AIR 애플리케이션에서 대량의 INSERT 문을 수행할 때, 효율적으로 수행할 수 있는 방법과, 런타임에 응답 없음과 같은 오류가 발생하는 원인에 대해 알아 봅시다.

위의 애플리케이션은 트랜잭션을 적용하고, 적용하지 않은 200개의 INSERT문을 실행하고, 수행에 걸리는 시간을 검사하는 애플리케이션 입니다.

 

실행결과 재미있게도, 200개의 INSERT문을 실행했을 뿐인데, 트랜잭션을 적용한 것과, 적용하지 않은 것의 수행시간 차이는 무려 200배 넘게 차이가 나네요.

수행시간에서 차이가 있는 이유는 간단한데, 트랜잭션을 적용한 예제의 경우, 트랜잭션을 시작한 후, 실행하는 쿼리는 모두 메모리에서 수행하게 되고, 커밋을 함과 동시에 하나의 쿼리 문만 날리게 되며, 하드에 영향을 미치는 작업은 단 한번만 이루어 지게 됩니다.

반면, 트랜잭션을 적용하지 않은 예제의 경우, 매 번 쿼리문을 날리게 되고, 쿼리문을 날릴 때 마다 하드를 탐색하게 되기 때문에, 실행 속도에 차이가 있는 것입니다.

디스크에 데이터를 쓰고 지우는 것과 같은 작업은, 디스크의 성능에 따라 크게 달라지고, 일반적인 작업에 비해 상당히 오랜 시간이 소요되기 때문에, 두 경우에서 같은 데이터를 DB에 추가하였다고 하더라도, 어마어마한 수행 시간 차이가 발생하게 되는 것입니다.

 

두 경우의 프로파일링을 수행 하였을 때에도, 실행시간에서는 200배 넘는 차이를 보이지만 메모리 점유면에서는 거의 차이가 없는데, 이는 메모리 문제가 아니라 하드와 관련된 문제임을 알 수 있습니다.

다만 트랜잭션을 사용할 경우 주의해야 할 점은, 커밋하기 전에 전원이 제거 될 경우 데이터베이스가 손상 될 수 있기때문에, 적절한 시점에서 커밋을 해 주는 것이 중요합니다.

실제로, Sqlite 개발자도 INSERT 문과 같은 DB에 실질적으로 영향을 주는 쿼리문은 하드를 직접 읽고 쓰기 때문에, 트랜젝션을 적절히 사용할 것을 추천하고 있습니다.


Actually, SQLite will easily do 50,000 or more INSERT statements per second on an average desktop computer. But it will only do a few dozen transactions per second. Transaction speed is limited by the rotational speed of your disk drive. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second.

Transaction speed is limited by disk drive speed because (by default) SQLite actually waits until the data really is safely stored on the disk service before the transaction is complete. That way, if you suddenly lose power or if your OS crashes, your data is still safe. For details, read about atomic commit in SQLite..

By default, each INSERT statement is its own transaction. But if you surround multiple INSERT statements with BEGIN...COMMIT then all the inserts are grouped into a single transaction. The time needed to commit the transaction is amortized over all the enclosed insert statements and so the time per insert statement is greatly reduced.

Another option is to run PRAGMA synchronous=OFF. This command will cause SQLite to not wait on data to reach the disk surface, which will make write operations appear to be much faster. But if you lose power in the middle of a transaction, your database file might go corrupt.

특히, AIR의 Sqlite는 런타임 위에서 실행되기 때문에, 대용량 INSERT와 같이 하드를 많이 제어할 경우엔, AIR 런타임 자체에 메모리 점유가 상당히 높아지게 되어, AIR 런타임이 응답이 없거나 강제종료 되는 상태가 발생 할 수도 있습니다.

따라서, AIR 애플리케이션에서 대용량 INSERT 문을 AIR에서 수행해야 할 경우엔, 트랜잭션을 적절히 활용하는 것이 좋습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License