SQLite3で大量(といっても数百件だが、組み込みでCPUが貧弱かつトランザクションが必要なため出来る限り処理を早くする必要がある)にSelect/Insert文を発行する可能性があるパターンが出てきてしまったので、高速化のためPreparedStatementを使うことにした。
ここを参考にさせて貰いつつ、本家のドキュメントを読むと↓のような手順になるようだ。
原文と一緒に意訳も載せたが、意訳意味ないな…
- Create the object using sqlite3_prepare_v2() or a related function.
sqlite3_prepare_v2を使ってsqlite3_stmtハンドルを作成する。- Bind values to host parameters using the sqlite3_bind_*() interfaces.
sqlite3_bind_*を使ってSQL内の「?」「?n」「:v」「@v」「$v」を実際に値に割り当てる。nは任意の数値、vは任意のラベル名- Run the SQL by calling sqlite3_step() one or more times.
sqlite3_stepを使ってSQLを実行する。Selectなどの場合は複数回回して一行づつレコードをもらう。- Reset the statement using sqlite3_reset() then go back to step 2. Do this zero or more times.
sqlite3_resetでstatementをリセットし、2から繰り返すことで、Bindingを変更してSQLを実行できる。- Destroy the object using sqlite3_finalize().
一通り終わったら sqlite3_finalizeを使って、1で作ったsqlite3_stmtハンドルを開放する。
sqlite3_stmtはsqlite3_freeで開放しないってところが注意点かな。
ここによると、
sqlite3_prepareとsqlite3_stepを使ってINSERT処理を最適化すると、最適化しない場合より2.2~2.3倍速くなる。
とのことなので、十分効果は見込める予想。
Comments are closed here.