在程序启动时,我将整个数据库的完整对象图(没有延迟加载)加载到域对象中。我知道这不是典型的用法,但这不在问题范围内。数据库只能由单个用户/程序访问。下面的条件是关于这个单一的启动负载操作;
随着数据库的增长,加载时间变得很长。我有同一个数据库的两个状态的这些数字;
1. Size 1.6MB, 3 main tables row count; 1100, 2400, 13400. Load time; 44s
2. Size 3.6MB, 3 main tables row count; 2800, 6200, 26700. Load time; 3m 40s
3个表有这些列;
7x integer, 4x numeric, 6x text, 2x datetime (2800 rows)
7x integer, 3x numeric, 11x text, 2x datetime (6200 rows)
4x integer, 2x numeric, 5x text, 1x datetime (26700 rows)
所有映射都是1:m
.
CPU Profiler 显示了这一点;http://img585.imageshack.us/img585/4444/6rh.png
不胜感激;
- 对于这种情况,可以(非常粗略地)预期/瞄准什么加载时间?这些时间是否合理或完全超出图表?
- 瓶颈可能是什么?
- 不同的数据库可能性能更好吗?(哪一个?)
- 任何改善加载时间的相关建议
编辑:
映射;
public class AccountBaseMap : ClassMap<AccountBase>
{
public AccountBaseMap()
: base()
{
Id(x => x.Id).GeneratedBy.Identity();
HasMany(x => x.Executions).KeyColumn("Account__Id").Cascade.All();
HasMany(x => x.Orders).KeyColumn("Account__Id").Cascade.All();
//...value types omitted
References(x => x.RiskProfile).Cascade.All();
}
}
public class LocalOrderMap : ClassMap<LocalOrder>
{
public LocalOrderMap()
: base()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Account__Id);
//...value types omitted
HasMany(x => x.StatusDetails).KeyColumn("Order__id").Cascade.All();
}
}
public class OrderStatusDetailMap : ClassMap<OrderStatusDetail>
{
public OrderStatusDetailMap()
: base()
{
Id(x => x.Id).GeneratedBy.Identity();
//...value types omitted
Map(x => x.Order__Id);
Map(x => x.Time).CustomType("timestamp");
}
}
NHibernate ShowSql,来自查询;
_session.CreateCriteria(T)().List(T)();
输出; (大约有 1000 行,类似删除在.....)
http://textuploader.com/?p=6&id=ie7mn
编辑2:
NHibernate 配置;
var fcfg = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.ConnectionString(connString));
fcfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<TMap1>().Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()));
if (typeof(TMap1) != typeof(TMap2))
fcfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<TMap2>().Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()));
fcfg.ExposeConfiguration(c => cfg = c).Cache(c => c.UseQueryCache());
sessionFactory = fcfg.BuildSessionFactory();
我不使用任何日志框架,所以认为不应该打开日志。虽然我目前确实运行调试版本,但应检查发布版本是否有任何不同。
关于建筑;解决方案设置为任何 CPU,项目构建为 x86(平台目标)。我在 x86 XP 和 x64 Windows 7 上都运行,并在此基础上加载正确的 System.Data.SQLite.dll。
顺便说一句,我正在使用NHibernate 3.1.0.4