巨大的插入物和系统使用NH3减速

时间:2011-03-07 12:00:58

标签: performance nhibernate caching

我必须在从db中获取的实体上插入一个子节点并保存更新后的实体。

没有。实体:10000 子女人数:17000(每个实体一个或多个子女,每个实体不是17000个。)

我尝试过使用查询缓存,但是在每次运行15毫秒的1000个查询之后,每1000次插入时间翻倍。

我尝试过获取所有实体并使用查询缓存,但是从缓存中获取10000也非常慢。

我该如何解决? 我必须按名称获取实体查询,附加新子项并保存。

修改

我为所有操作使用一个Session。我基本上有一对文件作为输入对 “实体名称”| “孩子的名字”

在我的UI中,我创建了一个AddChildTo(entityName,childName)操作列表。 在我的WCF背后的服务中,我枚举了所有操作,并且每个操作都根据entityName检索实体,根据childName创建一个新的Child,将子项添加到实体并保存实体。

事务包含要执行的所有操作,因为如果一个操作失败,则必须删除所有操作。

我创建一个秒表并花时间做1000次操作。每1000次操作时间翻倍。

在方法中创建一个仅执行查询以检索实体的秒表我意识到查询是增加最终总时间的部分。

这些是为每个孩子执行的查询:

INSERT INTO Child
       (Codice, EntityId, CabinaUid, ComuneUid, Nota1, Nota2, Nome,
        Descrizione, Master, ColoreMaster, ValidFrom,ValidUntil,
        Uid, EntityType)
VALUES     ('IT022E00355269' /* @p0 */,
        9333 /* @p1 */,
        '00000000-0000-0000-0000-000000000000' /* @p2 */,
        '00000000-0000-0000-0000-000000000000' /* @p3 */,
        NULL /* @p4 */,
        NULL /* @p5 */,
        'IT022E00355269' /* @p6 */,
        'IT022E00355269' /* @p7 */,
        0 /* @p8 */,
        0 /* @p9 */,
        '01/01/0001 00:00:00' /* @p10 */,
        NULL /* @p11 */,
        '5c40f801-489d-459f-81ca-0cb53655e50f' /* @p12 */,
        'Child')

select SCOPE_IDENTITY()

and

SELECT this_.Id           as Id14_0_,
       this_.Codice       as Codice14_0_,
       this_.Interruttore as Interrut4_14_0_,
       this_.CabinaUid    as CabinaUid14_0_,
       this_.ComuneUid    as ComuneUid14_0_,
       this_.Nota1        as Nota7_14_0_,
       this_.Nota2        as Nota8_14_0_,
       this_.Nome         as Nome14_0_,
       this_.Descrizione  as Descriz10_14_0_,
       this_.Master       as Master14_0_,
       this_.ColoreMaster as ColoreM12_14_0_,
       this_.ValidFrom    as ValidFrom14_0_,
       this_.ValidUntil   as ValidUntil14_0_,
       this_.Uid          as Uid14_0_
FROM   Entity this_
WHERE  this_.Nome = 186034 /* @p0 */
       and ((this_.ValidUntil is null 
              or this_.ValidUntil > '01/01/0001 00:00:00' /* @p1 */)
            and this_.ValidFrom <= '01/01/0001 00:00:00' /* @p2 */)

2 个答案:

答案 0 :(得分:0)

诊断性能问题:

  • 首先检查要执行的SQL查询。 (在此发布)
  • 请确保您在亲子关系的一侧使用反向,请查看我的帖子NHibernate parent-childs save redundant sql update executed
  • 在一个会话中执行查询(如果所有查询都在一个Isession中,则不需要使用某些特殊缓存)
  • 使用Transaction,有些db就像SQLite那样插入|在事务中更快地更新操作。

答案 1 :(得分:0)

关于你是如何做的,没有足够的信息,但这里有一些在NH中处理大型数据集的一般技巧:

  • 如果可能,将工作拆分为多个逻辑工作单元(每个工作单元都是会话)
  • 始终将默认的冲洗模式更改为自动
  • 以外的其他模式
  • 考虑将无状态会话和HQL DML用于批量方案
  • 在支持它的数据库中启用ADO.NET批处理
  • 不是对每个实体执行10000次查询,而是使用返回数据集较大部分的查询
  • 使用分析器确定您的瓶颈

我认为查询缓存不会帮助你(可能我不理解你的用例)