0

SQLite3 db に次のようなテーブルがあります。

Create Table Images (ID PRIMARY KEY, Height INTEGER, Width INTEGER, FileName TEXT, Thumb BLOB)

Thumbs はかなり小さく (@ 20kb)、テーブルのカーディナリティは 100,000 ~ 200,000 行程度です。

SELECT ID, FILENAME FROM IMAGESテーブルに BLOB がある場合と、Images.ID への外部キーを持つ別のテーブルに BLOB を移動した場合、同じクエリ ( ) の間には速度に大きな違いがあります。フィールドがクエリに存在しないことに注意してください。

IOW、テーブル内の BLOB フィールドの単純な存在 (または存在しない) は、そのフィールドがクエリに存在しない場合でも、パフォーマンスに大きな影響を与えますか?

4

1 に答える 1

2

BLOB データは、テーブルの各レコードに他の列と共に格納されます。そのため、クエリで複数のレコードにアクセスする必要がある場合、実際には一部の列のみがアプリケーションに返されたとしても、すべてのデータをディスクから読み取る必要があります。

デフォルトの 4 KB ページ サイズの場合、4061 バイトを超えるレコードはオーバーフロー ページを使用して格納され、それらのページはオンデマンドでのみ読み込まれます。そのため、BLOB 列もそれ以降の列も使用されていない場合、オーバーフロー ページはアクセスされません。ただし、少なくともレコードの最初の 489 バイトは常にテーブルの B ツリー ページに格納されるため、レコード内の他の値が多くのスペースを必要としない場合でも、テーブルのページ内のスペースの大部分は依然として BLOB によって占められています。データ。

于 2013-06-24T08:23:46.207 に答える