ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 SQLite 속도 향상!
    Android 2013. 3. 26. 18:48

    출처 : http://osh2357.blog.me/130098179373


    안드로이드에서 사용하는 SQLite 는 모바일에서 가볍게 사용하기에 너무 좋다.

     하지만 다수의 Insert 문을 반복할때의 수행속도는 입이 쩍벌어지게 느렸는데......

     원인을 파해쳐보니 SQLite 에서는 Transaction을 사용하고 안하고의 차이가 다량 Insert 시 엄청난 시간 차이를 보여주고 있었다.

     다음 사이트의 Insert Test 를 보면 이해가 되리라 -> http://www.sqlite.org/speed.html

     

    1000 건의 record 를 Insert 했을시에

    SQLite 는 13.061 초

    MySQL 은 0.114 초가 걸린다

     

    반면에 25000 건의 record 를 Transaction 을 이용하여 Insert 했을시에

    SQLite 는 0.914 초

    MySQL 은 2.184 초가 걸렸다..

     

    record 의 수는 25배가 늘었지만 Transaction 처리를 함으로

    MySQL 의 속도 향상 대비 SQLite 의 경우 오히려 처리 속도 차이는 어마어마 하다

     

    건수로만 비교했을때 25배 늘어난 데이터 처리속도는, Transaction 비 처리시

    SQLite 는 326.525초 (헉), MySQL 은 2.85초가 예상된다

     

    326.525초 -> 0.914 초 어마어마하지 않은가..

     

    물론 이 SQLite 를 Android 에서 구동하느냐 iPhone 에서 구동하느냐 PC 에서 구동하느냐에 따른 차이도 많이 있을것이다..

    하지만 확실한건 반복된 Insert 구문 사용시에는 Transaction 을 반드시 걸어야 할것으로 보인다~

    - Android 에서 테스트시 Select 구문이 포함된 반복문이어서 정확한 속도비교는 불가능했으나 소모시간 약  1/10 수준으로 빨라졌다

     

     

    자. 그럼 이제 Android 에서 Insert 시 Transaction 사용 구문 예제를 알아보자.

    늘상 사용하는 방식대로라면 아래와 같이 사용하게 될것이다.

     

    db.insert(TABLE_NAME, null, VALUE);

     

    이것을 이제는 다음과 같이 사용하면 된다. (물론 반복문에서 사용할때 큰 효과를 발휘한다)

     

    db.beginTransaction();

    db.insert(TABLE_NAME, null, VALUE);

    db.setTransactionSuccessful();

    db.endTransaction();

     

    그런데 이렇게 쓰고나면 뭔가 좀 허전해보인다.. SQL Exception 이 발생할 경우를 대비해야 하는데, 아래와 같이 수정한다.

     

    try{

    db.beginTransaction();

    db.insert(TABLE_NAME, null, VALUE);

    db.setTransactionSuccessful();

    } catch (SQLException e){

    } finally {

    db.endTransaction();

    }

     

    보통의 경우라면 insert 구문 부근에는 조건문이나 반복문이 있으리라~

Designed by Tistory.