Further to Richards comment the formula to determine when a record
overflows into a page file is given in section 1.5 of the file format
doc

http://www.sqlite.org/fileformat.html

The relevant section states:

The amount of payload that spills onto overflow pages also depends on
the page type. For the following computations, let U be the usable
size of a database page, the total page size less the reserved space
at the end of each page. And let P be the payload size.

Table B-Tree Leaf Cell:

If the payload size P is less than or equal to U-35 then the entire
payload is stored on the b-tree leaf page. Let M be
((U-12)*32/255)-23. If P is greater than U-35 then the number of byte
stored on the b-tree leaf page is the smaller of M+((P-M)%(U-4)) and
U-35. Note that number of bytes stored on the leaf page is never less
than M.

So in your case with a max blob size of 49870 bytes (which is > U-35)
so as far as I see it all the blobs can fit onto a single page and
acccording to that formula they should be.

Certainly in my testing I used your schema (with rowids) and wrote a
single blob of size 60000 bytes to a DB with a pagesize of 65536 bytes
and the complete blob was stored in one page as expected (and as shown
below).

http://sandersonforensics.com/pics/largeblobhdr.jpg

http://sandersonforensics.com/pics/largeblob.jpg

You have truncated some of the data for DBs with page size > 512 - I
assume you have determined that this is not relevant but without the
info I can't draw any conclusions. I also assume that you started a
new instance of sqlite between tests?

Perhaps I could suggest that you do a similar test to mine just adding
one (or a small handful) of blobs to the table and see if this sheds
any light on what is going on.








Paul
www.sandersonforensics.com
skype: r3scue193
twitter: @sandersonforens
Tel +44 (0)1326 572786
http://sandersonforensics.com/forum/content.php?195-SQLite-Forensic-Toolkit
-Forensic Toolkit for SQLite
http://sandersonforensics.com/forum/content.php?168-Reconnoitre - VSC
processing made easy



On 1 December 2014 at 13:13, Richard Hipp <[email protected]> wrote:
> On Sun, Nov 30, 2014 at 11:06 PM, Александр Гурьянов <[email protected]>
> wrote:
>
>> Hi. Hi. I am writing an app that stores some blobs in sqlite3 database. My
>> question is about disk space usage.
>> For analyst i use sqlite_analyzer.
>>
>> My database is created with this script:
>>
>> PRAGMA page_size = 512;
>> PRAGMA synchronous = OFF;
>> PRAGMA journal_mode = MEMORY;
>> begin;
>> create table grid_blobs(grid_id integer, blob blob, PRIMARY KEY(grid_id))
>> WITHOUT ROWID;
>>
>
> You'll have much better success here if you omit the WITHOUT ROWID.  See
> section 4.0 "When to use WITHOUT ROWID" at
> https://www.sqlite.org/withoutrowid.html for additional information.
>
> See also:   http://www.sqlite.org/affcase1.html#smaller
>
>
>
>
>> insert into grid_blobs values(0, randomblob(70));
>> insert into grid_blobs values(1, randomblob(66));
>> insert into grid_blobs values(2, randomblob(82));
>> insert into grid_blobs values(3, randomblob(79));
>> insert into grid_blobs values(4, randomblob(67));
>> insert into grid_blobs values(5, randomblob(124));
>> insert into grid_blobs values(6, randomblob(119));
>> insert into grid_blobs values(7, randomblob(70));
>> insert into grid_blobs values(8, randomblob(82));
>> insert into grid_blobs values(9, randomblob(75));
>> --... (other entries)
>> insert into grid_blobs values(2703, randomblob(698));
>> commit;
>>
>> There are 2703 entries with blob length from 31 bytes up to 49870 bytes
>> (avg: 2297, median: 332).
>> The output of sqlite_analyzer for this table is:
>>
>> sqlite3 test.db "PRAGMA page_size=512; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Percentage of total database......................  99.984%
>> Number of entries................................. 2437
>> Bytes of storage consumed......................... 3229184
>> Bytes of payload.................................. 2608484     80.8%
>> Average payload per entry......................... 1070.37
>> Average unused bytes per entry.................... 235.34
>> Average fanout.................................... 8.00
>> Non-sequential pages.............................. 0            0.0%
>> Maximum payload per entry......................... 49877
>> Entries that use overflow......................... 2321        95.2%
>> Index pages used.................................. 35
>> Primary pages used................................ 268
>> Overflow pages used............................... 6004
>> Total pages used.................................. 6307
>> Unused bytes on index pages....................... 1774         9.9%
>> Unused bytes on primary pages..................... 8836         6.4%
>> Unused bytes on overflow pages.................... 562916      18.3%
>> Unused bytes on all pages......................... 573526      17.8%
>>
>> sqlite3 test.db "PRAGMA page_size=1024; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 4679        10.6%
>> Unused bytes on primary pages..................... 17233        5.7%
>> Unused bytes on overflow pages.................... 933114      28.7%
>> Unused bytes on all pages......................... 955026      26.5%
>>
>> sqlite3 test.db "PRAGMA page_size=2048; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 13738       14.6%
>> Unused bytes on primary pages..................... 37882        6.6%
>> Unused bytes on overflow pages.................... 1184110     37.0%
>> Unused bytes on all pages......................... 1235730     31.9%
>>
>> sqlite3 test.db "PRAGMA page_size=4096; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 16017       12.6%
>> Unused bytes on primary pages..................... 57645        6.3%
>> Unused bytes on overflow pages.................... 1264444     43.2%
>> Unused bytes on all pages......................... 1338106     33.7%
>>
>> sqlite3 test.db "PRAGMA page_size=8192; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 31248       18.2%
>> Unused bytes on primary pages..................... 70063        5.5%
>> Unused bytes on overflow pages.................... 1535111     54.6%
>> Unused bytes on all pages......................... 1636422     38.4%
>>
>> sqlite3 test.db "PRAGMA page_size=16384; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 52549       24.7%
>> Unused bytes on primary pages..................... 88974        5.1%
>> Unused bytes on overflow pages.................... 1202291     59.7%
>> Unused bytes on all pages......................... 1343814     33.9%
>>
>> sqlite3 test.db "PRAGMA page_size=32768; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 36957       18.8%
>> Unused bytes on primary pages..................... 104610       5.0%
>> Unused bytes on overflow pages.................... 1104895     70.2%
>> Unused bytes on all pages......................... 1246462     32.2%
>>
>> sqlite3 test.db "PRAGMA page_size=65536; vacuum;" &&
>> ~/Downloads/sqlite3_analyzer test.db > analyze
>> Unused bytes on index pages....................... 115861      44.2%
>> Unused bytes on primary pages..................... 179123       7.2%
>> Unused bytes on overflow pages.................... 427834      72.5%
>> Unused bytes on all pages......................... 722818      21.6%
>>
>> As you can see there are initially 18% of unused space in overflow pages.
>> As far as I understand it means that there are
>> some blobs that do not fit into primary pages and these blobs are stored in
>> overflow pages. But with increasing page size the unused space on overflow
>> pages are also growth. Even when the page size is greater then max blob
>> size (page_size = 65536, max blob = 49870) there are 72.5% of unused bytes
>> on overflow pages. Why?
>>
>> _______________________________________________
>> sqlite-users mailing list
>> [email protected]
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
>>
>
>
> --
> D. Richard Hipp
> [email protected]
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to