Higher-level caches are also possible. Caching query results, or intermediate results, or on-demand creation of materialized views based on usage. OLTP databases find disk block caches useful, analytic databases generally cache at a higher level (thus saving both IO and CPU).
These forms of caching are further removed from the disk cache, therefore offer more incremental benefit than a cache at the scan level. Also, the data higher up the pipeline tends to be much smaller. I'm not saying we should do any of these. Just laying out the options. Julian