SQLite Bulk Insert 가장 빠른 방법은? |
결론 : 일반적인 Bulk Insert 보다 UNION 을 사용한 방법이 훨씬 빠르다.
일반 bulk insert
SQLiteDatabase db = null;
SQLiteStatement statement = null;
try{
db = getWritableDatabase();
db.beginTransaction();
statement = db.compileStatement("INSERT INTO table_name ( id, name, ... ) values( ?, ?, ... )" );
for( Item item : items ){
statement.bindLong(1, item.id );
statement.bindString( 2, item.name );
...
statement.execute();
}
statement.close();
db.setTransactionSuccessful();
} catch( Exception e ){
Log.e( TAG, "bulkInsert", e );
} finally{
if ( db != null ){
db.endTransaction();
}
}
UNION insert !!!
SQLiteDatabase db = getWritableDatabse();
StringBuilder sb = new StringBuilder();
sb.append( "INSERT INTO " ).append( tableName ).append( "(" )
.append( "id," )
.append( "name," )
.append( "..." )
.append( ")" );
for( Item item : items ){
// string 은 ' ' 감싼다.
sb.append( "UNION SELECT " ).append( item.id ).append( "," )
.append( item.name ).append( "," )
.append( ... )
.append( " " );
}
db.execSQL( sb.toString().replaceFirst( "UNION" ", "" ));
경우에 따라 다르겠지만, 약 50% 의 성능향상.
-
결론
UNION Insert 는 코드 직관성에서는 떨어지지만, 성능이 중요한 bulk insert 를 할 때 사용하면 좋겠다.
-
참고사항1.
InsertHelper 라는 helper 클래스가 있긴 한데, API level 17 에서 deprecate 되었고, 성능도 그렇게 눈에 띄게 빠르지 않다.
-
참고사항2.
Android SQLite 의 Cursor 는 max 1MB 의 데이터만 들고 있을 수 있다.
-
참고사항 3.
SQL Satement 의 길이는 기본 1,000,000 으로 제한되어 있으므로 고려해서 statement 를 만들면 된다.
http://www.sqlite.org/limits.html
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Thread Scheduling 에 대한 이야기 (0) | 2015.12.22 |
---|---|
[android] toLowerCase() 에 대한 고찰 ( 터키어, 이스라엘어, 리투아니아어 ) (0) | 2015.12.21 |
[android] Serialization 을 사용할 때 다음의 예외를 고려하자. (0) | 2015.12.17 |
[android] intent data filter - android:ssp xml attribute. (0) | 2015.12.16 |
[android] Activity Configuration Change Simulation. (0) | 2015.12.14 |
댓글