NHibernate 参数嗅探,SQL Server 2005 与 SQL Server 2008

F.B*_*ate 6 sql-server-2005 sql-server-2008

NHibernate 自动使用带有不同参数的 sp_executesql 来执行它的数据。现在我们在生产中注意到的是,我们有时会受到参数嗅探的影响。通过这种方式,查询性能不仅会受到影响,而且实际上会导致超时。

我不是 DBA,所以我有点犹豫,但对我来说,查询似乎正在针对少量数据(10 行)进行优化,然后必须查询大量数据(150000 行),这些数据正在打磨它停止。

现在我发现了 4136 Trace,它完全禁用了 SQL Server 实例的参数嗅探。

现在,由于我们也在升级我们的一些服务器,我想知道 NHibernate 在 SQL Server 2008 上的行为是否与 2005 年有所不同。例如,它是否添加了 OPTIMIZE FOR UNKOWN 点点滴滴。

据我所知,SQL 2008 中添加了一些“工具”,以便更好地处理这些参数嗅探问题。我很好奇 NHibernate 是否采用了这些工具并使用它们,或者如果我们更改为 SQL Server 2008,我们仍然必须使用此跟踪或类似的东西来处理这些问题。

小智 5

我不知道您使用的是哪个版本的 NH,但我使用的是 3.1 和 SQL 2008,它没有任何特殊功能来处理参数嗅探。我知道这一点,因为我在试图克服这个问题时受了很多苦。

我不知道你是否使用 HQL/Criteria/QueryOver/LINQ,但我找到了两种方法来(有点)解决这个问题:

  • 如果您使用 QueryOver/LINQ 之类的工具,请在查询上附加“选项(重新编译)”-> 在查询执行上带有一个钩子。

尽管这有效,但它不再从缓存中获取现有的查询计划,并且每个查询都必须从头开始构建。

  • 有条件地,向查询添加一个虚拟谓词

或者会强制获取不同的查询计划的东西。例如,如果日期间隔小于一个月,则添加.Where(x => true). 然后它会有一个不同的大间隔计划和一个小间隔计划。