私は nHibernate を初めて使用し、単純な選択クエリの結果が非常に遅いです。多分私は明らかな何かを見逃しています。以下のような状況です。
- 流暢な nHibernate を使用しています。
- Oracle データベース (10g) にクエリを実行しています。個人オブジェクトを返そうとしています。
- レコードあたり約 16 秒かかります。
これが私の流暢な nHibernate コードです。
public class Person
{
public virtual string PersonId { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Schema("MyTestDB");
Table("Person");
Id(i => i.PersonId);
Map(i => i.FirstName);
Map(i => i.LastName);
}
}
実際のデータを取得すると想定されるコードは次のとおりです。
var sessionFactory = Fluently.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(@"User Id=tester;Password=tester99!;Data Source=MyTestDB;").ShowSql()).Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())).BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
using (session.BeginTransaction())
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
var person = session.QueryOver<Person>()
.Where(p => p.PersonId == "1").SingleOrDefault();
stopWatch.Stop();
var ts = stopWatch.Elapsed;
var time = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds/10);
Console.WriteLine("Retrieved object: Person, Id: {0}, First Name: {1}, Last Name: {2} in [{3}]", person.PersonId, person.FirstName, person.LastName, time);
}
}
PersonId 列はインデックス化されており、主キーです。
これまでのところ、これを理解するための私の試みは、nHibernate によって生成された同じ SQL を ADO.Net で実行することでした。クエリは非常に高速に実行されました (ストップウォッチの経過時間は 0 です)。
plsql developer を使用してデータベースで同じクエリを実行すると、同じ高速な結果が得られました。これは、クエリでもデータベースでもないと思うことを示唆しています。
これをさらにデバッグするにはどうすればよいですか? nHibernate プロファイラーはこれに役立ちますか (現時点では利用できません)?
アイデアはありますか?