L'algoritmo di eliminazione della cache per il caching del piano di query in Entity Framework è descritto in sezione 3.2.2 come questo:
Once the cache contains a set number of entries (800), we start a timer that periodically (once‐per‐minute) sweeps the cache.
During cache sweeps, entries are removed from the cache on a LFRU (Least frequently – recently used) basis. This algorithm takes both hit count and age into account when deciding which entries are ejected.
At the end of each cache sweep, the cache again contains 800 entries.
Whenever an attempt to execute a query is made, the query pipeline looks up its query plan cache to see whether the exact query is already compiled and available. If so, it reuses the cached plan rather than building a new one. If a match is not found in the query plan cache, the query is compiled and cached.
Domanda
Perché la cache viene ridotta a 800 voci e non Min(800, all_cached_queries_below_some_ratio)
?
In uno scenario ipotetico in cui ho utilizzato una query memorizzata nella cache ampiamente utilizzata l'80% delle volte e altre 799 utilizzate una volta. Da questo momento in poi, ogni volta che comincio a utilizzare una nuova query utilizzata di frequente, attiverà uno sweep per rimuovere una delle query non utilizzate frequentemente e archiviare quella nuova.
Certo, questo succede solo una volta ogni 60 secondi ma non mi sembra l'azione più economica che ci sia.