2012-03-18 8 views
0

私はreadonlyデータベース用のIPhoneアプリケーションでsqliteを使用しています。 1つのユース・ケースでは、それぞれ約3行を戻すselect文を多数発行します。 次のクエリのパラメータは前のクエリの結果に依存するため、クエリの数を減らすことはできません。 クエリ自体は非常に簡単である:sqliteは読み取りパフォーマンスを最適化します

SELECT int1, int2, int3, int4 , int5, int6, int7 FROM sometable WHERE (int1 = ? AND int2 = ?) or (int3 = ? and int4 = ?) ORDER BY ROWID 

テーブルは、インデックス(INT1、INT2)とインデックス(INT3、INT4)を有しています。すべてのintのデータ型はINTEGER

です。クエリはC-APIを介して行われます。ステートメントはsqlite3_prepare_v2()でコンパイルされ、すべてのクエリに使用されます。各クエリの後、新しいパラメータをバインドする前に、文のsqlite3_reset()が実行されます。

データベースファイルは、フラグSQLITE_OPEN_READONLYおよびSQLITE_OPEN_NOMUTEXで開きます。 IPhone上でプロファイリング

は時間の大部分は、sqlite3_step()に費やされていることを示して - )> sqlite3VdbeExec-> sqlite3BtreeBeginTrans-> sqlite3PagerSharedLock->ラインpVfs-> xAccess(

私はsqliteの専門家だが、不必要なロックに時間が浪費されているように思えます。 このクエリが実行されている間はデータベースにアクセスできないことが保証されているため、不要です。 また、sqlite3BtreeBeginTransについても不思議です。 select文に対してトランザクションが作成されますか?

これをさらに最適化する方法を教えてもらえますか?

答えて

1

のsqlite-userメーリングリストから正解: http://sqlite.org/pragma.html#pragma_locking_mode

スピードアップ約40%...

+1

それは念のために、あなたにリンクし、Webページ上のポイントを要約するとよいでしょうリンクが無効になり、情報が失われます。 –

関連する問題