私は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文に対してトランザクションが作成されますか?
これをさらに最適化する方法を教えてもらえますか?
それは念のために、あなたにリンクし、Webページ上のポイントを要約するとよいでしょうリンクが無効になり、情報が失われます。 –