トランスヒューマニズムと技術的特異点に興味があります。話題はテクノロジー、自然科学、コンピュータ、プログラミングなど。

transhumanist note

SQLiteで最も速く複数行INSERTする方法

SQLiteで複数行の挿入を1つのINSERT文で行うには、以下のようにします。
(MySQLのように、INSERT INTO テーブル名 VALUES ((0, 'a'), (1, 'b'), (2, 'c'))ではできません。)

INSERT INTO member
SELECT 0 AS id, 'foo' AS name
UNION ALL SELECT 1, 'bar'
UNION ALL SELECT 2, 'baz'
UNION ALL SELECT 3, 'qux';

(※memberテーブル。カラム構成はid integer, name textです。)

カラムの値を全て指定する場合は以下のようにASを抜かしても大丈夫なようです。

INSERT INTO member
SELECT 0, 'foo'
UNION ALL SELECT 1, 'bar'
UNION ALL SELECT 2, 'baz'
UNION ALL SELECT 3, 'qux';

なお、UNIONのALLを抜かすと重複データが挿入されなくなります。

INSERT INTO member
SELECT 0 AS id, 'foo' AS name
UNION SELECT 1, 'bar'
UNION SELECT 2, 'baz'
UNION SELECT 2, 'baz';

とした場合は、最後の行は挿入されません。
通常は、UNION ALLとした方が良いでしょう。

この書き方の注意点は、500件しか同時にINSERTできないということです。
500件を超えるものについては500件毎にINSERT文を作る必要があります。

他には、
BEGIN;
INSERT INTO member values (0, 'foo');
INSERT INTO member values (1, 'bar');
COMMIT;
という書き方もありますが、大量にデータを挿入する場合はUNIONを使用したほうが速いようです。
詳細は下記サイトを参照。
http://developer.appcelerator.com/question/104531/sqlite-multiple-insert

そこでは1544件の挿入時間の比較が書かれており、
Multiples INSERTs : 2500ms
Using BEGIN and COMMIT : 90ms
Using SELECT and UNION : 40ms
となっています。
実行速度・パフォーマンスが要求される部分での大量挿入ではこのUNIONを使用したINSERTを使っておきたいですね。

テーマ:プログラミング - ジャンル:コンピュータ




  1. 2013年08月21日 23:01 |
  2. データベース
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://muumu.blog25.fc2.com/tb.php/252-601e3ce4
この記事にトラックバックする(FC2ブログユーザー)