Customer テーブルを持つデータベースがあります。これらの顧客はそれぞれ、Installationテーブルへの外部キーを持ち、さらにAddressテーブルへの外部キーを持っています (テーブルは簡単にするために名前が変更されています)。
NHibernateでは、次のように Customer テーブルをクエリしようとしています。
ISession session = tx.Session;
var customers = session.QueryOver<Customer>().Where(x => x.Country == country);
var installations = customers.JoinQueryOver(x => x.Installation, JoinType.LeftOuterJoin);
var addresses = installations.JoinQueryOver(x => x.Address, JoinType.LeftOuterJoin);
if (installationType != null)
{
installations.Where(x => x.Type == installationType);
}
return customers.TransformUsing(new DistinctRootEntityResultTransformer()).List<Customer>();
次のような SQL クエリが生成されます ( NHibernate Profilerによってキャッチされます)。
SELECT *
FROM Customer this_
left outer join Installation installati1_
on this_.InstallationId = installati1_.Id
left outer join Address address2_
on installati1_.AddressId = address2_.Id
WHERE this_.CountryId = 4
and installati1_.TypeId = 1
上記の SQL クエリをMicrosoft SQL Server Management Studioで実行すると、約 5 秒で実行されますが、約 200.000 レコードが返されます。それにもかかわらず、コードの実行時にListを取得するのに多くの時間がかかります。結果なしで10分間待っていました。デバッグ ログは、オブジェクト階層が原因で、多くのオブジェクトが構築され、開始されたことを示していました。このパフォーマンスの問題を解決する方法はありますか?