2015-05-21 46 views
0

在linq中执行查询时,我的nhibernate调试日志显示我使用参数@ p0来表示生成的SQL中WHERE子句中的值。 这大约需要1分钟。Nhibernate查询比SSMS查询要慢

当我在SQL Server Management Studio中运行相同的查询(使用WHERE Campaign = 500进行简单选择)时,此查询需要1秒钟。

当我DECLARE @ P0 INT & SET @ P0 = 500,然后使用WHERE运动= @ P0,查询需要1分钟,以及...

有没有一种方法,使NHibernate的 “翻译”在我的数据库执行前,@ p0变成了500?

回答

1

不是我所知 - NHibernate将使用参数化查询,这通常是一件好事。困难在于,偶尔数据库引擎会生成一个查询执行计划,该计划对@ p0的某些可能值很有用,对其他用户不利。

我建议您检查您的索引,统计数据,并查看缓存查询计划的问题。根据具体情况,确切的解决方案可能会有所不同。也许某些索引只能在事先知道该值的情况下才能使用(然后可以更改索引以使其更一般化)。或者,也许你只需要重建它们?还有一些方法可以要求SQL Server不要使用缓存的查询计划 - 然后使用每个执行的已知参数值重新计算它。