Why it works this way2 min read

Blob V2, and what it hides

Lance can store a large value — a video, a model, an archive — in a side file, with the table holding a lazy handle to it. Search and filter cannot touch those bytes. This is the thing that makes a table of video searchable at the cost of a table of text, and it produces three effects the console has to handle carefully.

The manifest cannot see side files

tracked_files() lists no .blob paths, and total_files_size reports 43,424 bytes for a table holding 2.65 GB. The manifest is not wrong; it describes the files Lance manages, and the side files are not among them.

So the cheap figure and the true figure are different numbers answering different questions, and every panel that shows one says which. The true split comes from walking the directory, cached per table version because it is O(files).

A blob column is safe to project

The first version of the row browser assumed the opposite. Selecting a Blob V2 column yields a descriptor — position and size — not bytes. All 162 descriptors in the reference corpus cost 43 KB while describing 2.65 GB, which is why a row browser can truthfully print 16.7 MB in a cell it never read.

The columns that actually cost something are the ordinary ones. thumb_jpeg takes a page of rows from 34 KB to 383 KB.

The small-file count would mislead you

num_small_files flags all 16 fragments of the reference segments table, and by Lance's own measure it is right — the data files are 2.7 KB each. They also hold about 195 MB of video apiece.

A compaction button wired to that number would rewrite the small half of a table that needs nothing done to it. So the rule that reports the count is the same rule that says so:

This table keeps its bytes in Blob V2 side files, which the manifest cannot see. Its data files are small because that is where the data isn't — compacting them would rewrite 2.65 GB of side files to tidy up 0.1 MB of metadata.

The caveat is not decoration. A test fails if it goes missing.

There is a size threshold

Below roughly 8 MB, Lance packs a blob into the data file rather than giving the row its own extent. Eight blobs of 4 KB produce no side files at all. Measured, not assumed — a test fixture built to exercise the side-file path was not exercising it until the threshold was found.