SQLite の INSERT は遅いのか?
どうやら大量データの連続挿入はSQLiteの不得意な処理のようだ。と書かれている。1000件程度でこんなにかかるんだったら、10000件だったら160秒ぐらいかかる(単純すぎ。)って事? 実はこれにはからくりがあって、SQLite の処理は トランザクション の中でないと著しく遅いのだ。おそらく、これが原因なのではないかと思っている。
どうやら大量データの連続挿入はSQLiteの不得意な処理のようだ。と書かれている。1000件程度でこんなにかかるんだったら、10000件だったら160秒ぐらいかかる(単純すぎ。)って事? 実はこれにはからくりがあって、SQLite の処理は トランザクション の中でないと著しく遅いのだ。おそらく、これが原因なのではないかと思っている。
あるプロセスが データを書き換え中に、他のプロセスが書き換えできないようになっているようだ。
仕組みとしては、トランザクション中に、他のプロセスがトランザクションを開始しようとすると、SQLITE_BUSY ってのが返ってくる。 API の sqlite_busy_timeout() を使って、SQLITE_BUSY になるまでの時間をミリ秒で指定できる。
トランザクションの開始だけでなく、DELETE, INSERT, UPDATEなども出来ないようになっている。
FAQ : How do I create an AUTOINCREMENT field. で説明されているように、フィールドを INTEGER PRIMARY KEYで定義しておき、INSERT でそのフィールドに null値を代入すると、自動的に SEQUENCE 値が代入される。
あと、SEQUENCE値として代入された数値を取り出す場合は、API sqlite_last_insert_rowid() を使用する。
中神氏の Web サイトに、SQLite 関連というコンテンツがあり、Python モジュールのインストール方法と、Zope Database Adapter (中神氏が自作されたもののようだ)が置いてあった。
業務では、PostgreSQL を使いつづけていたんだけど、WEB+DB PRESS Vol.18 で見かけた SQLite っていうデータベースをインストールしてみた。
SQLite は、パブリック・ドメインであり、PHP5 に組み込まれているとの事。(MySQL は GPL であるために外されたんだっけ?)