Apple の推奨事項は、2 キロバイトを超える SQLite データベースに BLOB を保存しないことです。
SQLite はデータベースをページに編成します。各ページのサイズは 4 キロバイトです。SQLite データベース ファイルからデータを読み取ると、これらのページが内部ページ キャッシュに読み込まれます。iPhone では、このキャッシュのデフォルトのサイズは 1 メガバイトだと思います。これにより、隣接するレコードの読み取りが非常に高速になります。これは、それらが既にページ キャッシュにある可能性が高いためです。
SQLite がデータベース レコードをメモリに読み込むとき、レコード全体とそれが占有するすべてのページを読み込みます。そのため、レコードに BLOB が含まれている場合、多くのページを占有する可能性があり、既存のページをキャッシュから取り出して、BLOB レコードのページに置き換えることになります。
これは、すべての BLOB をスキャンして読み込んで何かを行う (たとえば、表示する) だけであれば、それほど悪くはありません。しかし、BLOB と同じ行にあるデータを取得するだけのクエリを実行した場合、このクエリは、レコードに大きな BLOB が含まれていない場合よりもはるかに遅くなります。
したがって、少なくとも BLOB データを別のテーブルに格納する必要があります。例えば:
CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER,
FOREIGN KEY(blob_id) REFERENCES blobs(id) );
または、BLOB データを SQLite データベースの外部にファイルとして保存することをお勧めします。
(CoreData を使用していない場合) SQL PRAGMA ステートメントを使用してページ キャッシュ サイズを微調整できる場合があることに注意してください。