It would be nice if we could evict pages, even if there have been new updates since the reconciliation. Or possibly as an extension, if we could evict partial sets of updates from a page.
The use case is that we sometimes see a cache with entries for a file like:
cache dump: file: 150385 pages, 3187MB, 3113MB dirty 5 < 1k 21 < 8k 148648 < 64k 1507 < 512k 45 < 1M 159 < 5M 0 > 5M
The leaf page size is configured as 8k, so an in-memory page that is 5M spans 640 on-disk pages.
The same file is showing quite a lot of reconciliation attempts that fail due to updates that could not be included:
Nov 06 10:14:49 2250 . page reconciliation calls Nov 06 10:14:49 2175 . reconciliation failed because an update could not be included Nov 06 10:15:20 5257 . page reconciliation calls Nov 06 10:15:20 5203 . reconciliation failed because an update could not be included Nov 06 10:15:50 3781 . page reconciliation calls Nov 06 10:15:50 3726 . reconciliation failed because an update could not be included Nov 06 10:16:20 1351 . page reconciliation calls Nov 06 10:16:20 1343 . reconciliation failed because an update could not be included Nov 06 10:17:20 2 . page reconciliation calls Nov 06 10:17:20 0 . reconciliation failed because an update could not be included Nov 06 10:17:50 4 . page reconciliation calls Nov 06 10:17:50 2 . reconciliation failed because an update could not be included Nov 06 10:18:24 5 . page reconciliation calls Nov 06 10:18:24 2 . reconciliation failed because an update could not be included
I've cherry picked the above statistics, but they are representative. The reduced numbers of reconciliation calls happens when the benchmark switches from loading data to the run (update and read) phase.
NOTE: This workload fits in cache - so the eviction server isn't running regularly.