n Problema de rendimiento de hibernación al cargar grandes colecciones

(solo para aclarar: mi aplicación no se trata realmente de empleados y departamentos. Solo uso estos términos, por ejemplo).
Cada departamento tiene una colección de empleados, que está cargada de manera perezosa. Cada vez que agrego un nuevo empleado, quiero asegurarme de que aún no exista en la colección, de modo que cargue la colección en la memoria y realice la verificación.
l problema está en el entorno de producción, tengo algunos departamentos con más de 10,000 empleados.
escubrí que recuperar la colección y luego salvar al nuevo empleado lleva MUCHO tiempo.
He hecho un pequeño experimento, en el que copié laexactamente el mism seleccione la declaración generada por nH para ADO.Net SQLDataAdapter. Aquí están los resultados

***16:04:50:437*** DEBUG NHibernate.SQL - SELECT ... FROM dbo.[Employee] emp0_ left outer join dbo.[Department] department1_ on emp0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE emp0_.SomeField_id=@p0;@p0 = 2
***16:05:00:250*** DEBUG NHibernate.SQL - SELECT ... FROM dbo.TableD codeshared0_ left outer join dbo.[Department] department1_ on codeshared0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE codeshared0_.Employee_id in (select emp0_.Id FROM dbo.[Employee] emp0_ left outer join dbo.[Department] department1_ on emp0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE emp0_.SomeField_id=@p0);@p0 = 2
16:05:04:984 DEBUG NHibernate.SQL - Reading high value:select next_hi from dbo._uniqueKey with (updlock, rowlock)
16:05:05:078 DEBUG NHibernate.SQL - Updating high value:update dbo._uniqueKey set next_hi = @p0 where next_hi = @p1;@p0 = 10686, @p1 = 10685
***16:05:05:328*** DEBUG MyApp.Managers - commiting
16:05:12:000 DEBUG NHibernate.SQL - INSERT INTO dbo.[Employee] (...) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);@p0 = 23/04/2011 04:04:49, @p1 = 23/04/2011 03:34:49, @p2 = 23/04/2011 04:04:49, @p3 = 23/04/2011 03:34:49, @p4 = '', @p5 = False, @p6 = 433, @p7 = NULL, @p8 = 2, @p9 = 10685
16:05:12:140 DEBUG NHibernate.SQL - UPDATE dbo.[Employee] SET Department_id = @p0 WHERE Id = @p1;@p0 = 2, @p1 = 10685
16:05:12:343 DEBUG MyApp.Managers - success
16:05:12:359 DEBUG MyApp.Tests - ------------------------------------------------------------
16:05:12:359 DEBUG MyApp.Tests - Finished nHib stuff- now switching to ADO 
16:05:12:359 DEBUG MyApp.Tests - starting SQL: SELECT ... FROM dbo.[Employee] emp0_ left outer join dbo.[Department] department1_ on emp0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE emp0_.SomeField_id=2
16:05:14:750 DEBUG MyApp.Tests - total rows received: 10036
16:05:14:750 DEBUG MyApp.Tests - SQL: SELECT ... FROM dbo.TableD codeshared0_ left outer join dbo.[Department] department1_ on codeshared0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE codeshared0_.Employee_id in (select emp0_.Id FROM dbo.[Employee] emp0_ left outer join dbo.[Department] department1_ on emp0_.Department_id=department1_.Id left outer join dbo.[TableC] TableC2_ on department1_.TableC_id=TableC2_.Id WHERE emp0_.SomeField_id=2)
16:05:15:250 DEBUG MyApp.Tests - total rows received: 2421

como puede ver: la búsqueda tarda ~ 15 segundos con nH, en comparación con ~ 2 segundos con ADO.Net.
Después de investigar un poco, sé que probablemente nH probablemente no esté destinado a almacenar tantos elementos en la sesión. ¿Puede pensar en alguna otra razón posible para este problema, o en otra sugerencia que no sea filtrar los Empleados en el nivel de base de datos?

Gracia

-EDITA -
Siguiendo las sugerencias a continuación, he intentado usar Reflection Optimizer (no hizo ninguna diferencia) e IStatelessSession para cargar mi colección (arroja una excepción: una sesión sin estado no puede recuperar colecciones).
Creo que mi código en la clase de Departamento tendrá que cambiar desde la limpieza:

if (this.Employees.Contains(emp))
{
  ...
}  

a esta versión 'más sucia':

var employeesRepository = IOCContainer.Get<IEmployeesRepository>();  
if (employeesRepository.EmployeeExists(this,emp))
{
  ...
}  

cualquiera tiene una mejor sugerencia?

Respuestas a la pregunta(3)

Su respuesta a la pregunta