본문 바로가기
프로그래밍 놀이터/안드로이드, Java

SQLite Bulk Insert 가장 빠른 방법은?

by 돼지왕 왕돼지 2015. 12. 18.
반응형

 SQLite Bulk Insert 가장 빠른 방법은?


api level 17, append, begintransaction, bindlong, bindstring, bulk insert, CLOSE, compilestatement, cursor, data, deprecate, endtransaction, execSQL, execute, getwritabledatabase, insert into, inserthelper, Max, replacefirst, setTransactionSuccessful, SQLite, SQLite Bulk Insert 가장 빠른 방법은?, sqlitedatabase, SQLiteStatement, statement, StringBuilder, union, union insert, 방법, 일반 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







반응형

댓글