Regular Motion

개발자가 상팔자

[Android] SQLite Bulk Insert.

1000개 이상의 Row를 Database에 Insert하는 기능을 구현하게 됐다.

Loop를 돌며 하나씩 Insert하는 방식으로 구현을 하니 단말기에 따라 15~30초 정도가 소요된다.

코딩호러가 주장하듯 성능은 곧 기능이다. 다행히도 아래 2가지 방법을 통해 쉽게 성능을 개선 할 수 있다.

(* 첫번째 방법의 경우 Transaction으로 처리해줘야 성능향상이 있다.)

 

1.  SQLiteStatement

 

2. INSERT UNION

 

1000개의 Row를 Insert하는 예제를 10번씩 테스트한 결과는 아래와 같다.

(* Union을 이용한 방법이 성능면에서는 월등한 것을 확인할 수 있다.)

SQLiteStatement : 138ms

Insert Union : 75ms

 

 

Conclusion

1.  SQLiteStatement

Interface가 직관적이고 제약사항이 없어서 간결하게 코드를 구현할 수 있는 장점이 있지만, 속도가 다소 느린 단점이 있다.

 

2. Insert Union

속도가 빠르다는 장점이 있지만, Query를 생성하는 코드의 가독성이 떨어지고, 한번에 처리할 수 있는 최대 Row가 SQLite의 경우 500개로 제한되어 있어 500개씩 나눠서 처리해야하는 단점이 있다.

 

약간의 성능 저하도 포기할 수 기능을 구현중이라면 Union을 사용하는게 바람직하고, 코드의 가독성 및 유지 보수가 더 중요하다면 SQLiteStatement를 사용하는게 바람직하다.

 

(혹시, 더 빠른 방법이 있으면 댓글로 좀 알려주시기 바랍니다.)

2 Comments

  1. 성능이 두배군.. 대단대단하넹!! 많이 배우고감!
    (500개 이상이면 Union 쿼리도 transaction으로 묶어 처리할 수 있지 않을까?)

    InsertHelper을 사용하면 Insert()나 execSQL() 보다 두배 성능을 낼수 있다고 하는데, Union과 비교해보면 어떨까?ㅎ
    Ref : http://hwh7.wordpress.com/2011/08/30/android-sqlite%EC%97%90%EC%84%9C-bulk-insertion-%EC%84%B1%EB%8A%A5-%ED%96%A5%EC%83%81/

답글 남기기

© 2017 Regular Motion

Theme by Anders NorenUp ↑