Thanks for the input Richard. I'll keep that in mind. I wasn't aware that the entire blob needed to be read for the row to be processed, especially if the query does not explicitly request that blob (which is the last column of course). But then what's the point of making blobs last then? A few MBs, e.g. 4MB, for a 3.5GB blob, that's close to a 1,000 rows. Isn't that going to be slowing things down? It's a trade off I guess. Also, I'd have naively expected VACUUM to work at the page level only, no need for decoding the rows. I forgot about overflow page chains that need updating on page movement, to record new page numbers.