Da, mi imamo nešto slično u našoj aplikaciji. To se u mom selu inače zove keširanje.
Imamo globalni keš, ne na nivou sesije. Ako se podaci razlikuju u zavisnosti od korisnika koji ih je zahtevao, dodamo još userid u keš ključ. Za keš koristimo gotovu MS-ovu helper klasu (tipa heštabele), a same kolekcije u XML-u (u pitanju je stablasta struktura, za razliku od tvog slučaja gde je u pitanju ravna tabela).
Keš je ograničen sopstvenim kapacitetom i helper se sam stara o izbacivanju najstarijih elemenata.
Imamo prilično komplikovan sistem "ručne" invalidacije keša, kad se promeni neki podatak koji se nalazi u nekoj keširanoj kolekciji. Plus veb servis za invalidaciju sa drugih servera iz veb farme.
Eh, da, zašto izvlačiš celu tabelu, a ne samo deo koji je korisnik tražio?