gpt4 book ai didi

c# - 为什么我的 NHibernate 查询这么慢?

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:16 24 4
gpt4 key购买 nike

我正在使用 Fluent NHibernate v2.0.50727 构建一个 ASP Web 表单应用程序到 SQL 服务器后端。

出于某种原因,查询具有小数据(~14 行)的表需要几秒钟。

map 都很简单:Id(x => x.Id)Map(x => x.Name)。 CertificateGroup 还有 Map() 的 ColorRank

我已经隔离了用于测试的 nhibernate 代码:(这并不代表我的应用程序,而是针对 SO 进行了简化和隔离)

protected void Page_Load(object sender, EventArgs e)
{
var config = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString("..."))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<PersonMap>()) .BuildConfiguration();
var factory = config.BuildSessionFactory();

using (var session = factory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var departments = session.QueryOver<DepartmentModel>().List(); // these all take seconds to execute - this has 14 results
var jobs = session.QueryOver<JobModel>().List(); // 113 results
var certificates = session.QueryOver<CertificateModel>().List(); //this one about 4 seconds for 210 results
var groups = session.QueryOver<CertificateGroupModel>().List();

var association = new CertificateAssociationModel
{
Department = departments.First(),
Job = jobs.First(),
Certificate = certificates.First(),
Group = groups.First()
};
session.SaveOrUpdate(association);
transaction.Commit();
}
}
}

我将 nhibernate 换成了 Entity Framework 并运行了上面的代码,抓取是即时的。

感谢任何帮助。

编辑:

这是映射(正如我上面解释的):对于部门、职位和证书:

public class DepartmentMap : ClassMap<DepartmentModel>
{
public DepartmentMap()
{
Table("tblDepartment");
Id(x => x.Id);
Map(x => x.Name);
}
}

CertificateGroupModel 也有 map (x => x.Rank); map (x => x.Color);

实体类都是一样的:

public class CertificateModel
{
public virtual Int32 Id { get; protected set; }
public virtual String Name { get; set; }
}

除了 CertificateGroupModel 还有:

public virtual String Color { get; set; }
public virtual Int32 Rank { get; set; }

这是我的 NHiberate 分析器结果:

 -- statement #1
begin transaction with isolation level: Unspecified

-- statement #2
SELECT this_.Id as Id4_0_,
this_.Name as Name4_0_
FROM tblDepartment this_

-- statement #3
SELECT this_.Id as Id5_0_,
this_.Type as Type5_0_
FROM tblJobTitles this_

-- statement #4
SELECT this_.Id as Id2_0_,
this_.Name as Name2_0_
FROM tblCertificate this_

-- statement #5
SELECT this_.Id as Id1_0_,
this_.Name as Name1_0_,
this_.Rank as Rank1_0_,
this_.Color as Color1_0_
FROM tbl_certificate_groups this_

-- statement #6
INSERT INTO lnk_certificate_associations
(Certificate_id,
Department_id,
Job_id,
Group_id)
VALUES (1 /* @p0 */,
1 /* @p1 */,
1 /* @p2 */,
1 /* @p3 */);



select SCOPE_IDENTITY()


-- statement #7
commit transaction

nhibprofile http://i.snag.gy/bTKHm.jpg

生成的 IL 代码:

                      var departments = session.QueryOver<DepartmentModel>().List();
IL_008F: ldloc.2 /* session */
IL_0090: callvirt instance NHibernate.IQueryOver`2<!!0, !!0> NHibernate.ISession::QueryOver<Core.Domain.Model.DepartmentModel>()
IL_0095: callvirt instance [mscorlib]System.Collections.Generic.IList`1<!0> NHibernate.IQueryOver`1<Core.Domain.Model.DepartmentModel>::List()
IL_009A: stloc.s departments

最佳答案

猜测,因为您还没有在这里发布您的映射和表格...

您的数据库中是否有任何可空列映射到不可空类型(例如,可空 int 映射到模型中的 int)?

这可能会导致您看到的那种行为,因为当 NHibernate 加载您的实体时(让我们假设 DepartmentModel 的上述场景,其属性 Prop1 是一个 int),如果 Prop1 在数据库中为 null,则 session 将有一个 null 的内部状态,但是因为你不能设置 Prop1 = null,它会被赋值为 0,当 session 检查是否有任何变化时,它会看到 Prop1 已经改变(从 null 到 0),并且导致一大堆更新,这反过来又会减慢速度。

如果是这种情况,解决方案是更新您的表定义或更新您的实体以具有正确的(可为空的)类型。

发生这种情况的方式有很多种,我刚刚给出了一个简单的示例 - 如果您可以包含映射、表定义和实体类,那将会有所帮助...

关于c# - 为什么我的 NHibernate 查询这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17064753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com