gpt4 book ai didi

sql-server - NHibernate.Exceptions.GenericADOException 代码超时而不是数据库超时

转载 作者:行者123 更新时间:2023-12-04 04:44:40 26 4
gpt4 key购买 nike

我有一个 NHibernate 查询(它正在填充一个 EXTJS 网格)

它向数据库发出 2 个查询,一个用于获取记录计数(用于分页),另一个用于获取前 N 行以填充网格。

从代码中,我一直在 Select count(*) 语句中遇到异常。

NHibernate.Exceptions.GenericADOException: 
Failed to execute multi criteria[SQL:
SELECT count(*) as y0_ FROM RecordView this_ inner join ProcessesView
process1_ on this_.ProcessId=process1_.Id inner join BusinessModelsView
businessmo3_ on process1_.BusinessModelId=businessmo3_.Id inner join BatchesView
batch2_ on this_.BatchId=batch2_.Id WHERE this_.ProcessId = ?;
] ---> System.Data.SqlClient.SqlException: Timeout expired.
The timeout period elapsed prior to completion of the operation or the server
is not responding.

但是,如果我采用该确切查询并将其放入 SSMS 窗口并运行它,它会在 <1 秒内执行。

NHibernate 在这里做了什么“有趣”的事情。是否存在执行计划/缓存问题。我完全不知道为什么会发生这种情况。

最佳答案

SQL SERVER 不会以相同的方式处理您的两个查询

  • 您的 NH 查询已在第一次执行时根据表统计信息和参数的第一个值进行编译。生成的查询计划将用于所有后续调用,无需考虑参数值
  • 您的 SQL 查询(我猜,您在哪里将 ? 替换为实际值)根据统计信息和值对每个值进行不同的编译。

  • 您的第一次 NH 编译可能生成了一个查询计划,对第一个值有效,但在一般情况下无效。

    首先,我建议:
  • 你依靠一个投影(比如在主表 id 上),因为它比 count(*) 更有效,允许数据库在可能的情况下只在索引上工作
  • 您检查是否没有遗漏查询所需的任何索引
  • 您检查所有表统计信息是否都是最新的

  • 如果这不能改善执行时间,这篇文章提供了一些选项(重新编译可能是一个不错的选择):
    Query executed from Nhibernate is slow, but from ADO.NET is fast

    关于sql-server - NHibernate.Exceptions.GenericADOException 代码超时而不是数据库超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18378878/

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