Again, the straightforward implementation of this technique has a severe drawback: it doesn't cope well with access frequencies that change over time. Why should something be kept in the buffer that is accessed infrequently, just because it used to be accessed frequently last week?

The obvious solution would be to only count the accesses in, e.g. the last five hours, but this is not feasible, because it would mean not just a single counter for each block, but a (possibly huge) number of access timestamps.

A good alternative are strategies that "age" the counters, e.g. decreasing all counters once per minute, but that would require touching the entire database each minute, which would be very bad for performance. A tolerable implementation might be one that subtracts a fixed larger amount from all counters or divides them by a constant in larger intervals. Another good idea might be a hybrid touch buffer / LRU strategy, in which the "importance" of a block is computed as the average between its touch count and the inverse of the time since it was last accessed.