【问题标题】:NHibernate and SQL query performance issue: stored procedure vs native SQLNHibernate 和 SQL 查询性能问题:存储过程与原生 SQL
【发布时间】:2014-02-11 09:35:48
【问题描述】:

我在 NHibernate 上执行 SQL 查询时遇到性能问题。

我尝试在 SQL 查询中导入存储过程的 SQL 代码,发现性能下降很大。

这是一个测试示例...

在我的映射文件中,我有以下两个定义:

<sql-query name="sp_Test1">
     exec MyStoredProcedure :Param1, :Param2, :Param3, :Param4
</sql-query>

<sql-query name="sp_Test2">
 <![CDATA[
     SELECT Field5 FROM MyTable 
     WHERE Field1 = :Param1 AND 
       Field2 = :Param2 AND 
       Field3 = :Param3 AND 
       Field4 = :Param4 
     ORDER BY Field5
 ]]>
</sql-query>

sp_Test2的本机代码与存储过程中的SQL代码完全相同。

现在,如果我运行这样的测试:

int count = 2500;

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i=0; i<=count; i++) {
     //Execute query "sp_Test1"
}
sw.Stop();
//Print sw.ElapsedMilliseconds

sw.Reset();

sw.Start();
for (int i=0; i<=count; i++) {
     //Execute query "sp_Test2"
}
sw.Stop();
//Print sw.ElapsedMilliseconds

sp_Test1 的执行时间约为 1 秒,而 sp_Test2 的执行时间约为 20 秒!

谁能告诉我是什么导致了这种性能下降?以及如何提高sp_Test2 的性能?

注意:我使用 NHibernate 2.1.2 进行此测试。

提前感谢您提供任何有用的信息。

【问题讨论】:

  • 我在你的测试中没有看到预热,我想当你反转你的测试时,你会得到相反的结果。
  • 我颠倒了测试,但结果是一样的……第一次运行大约 20 秒(sp_Test2),第二次运行大约 1 秒(sp_Test1)
  • 安装一个分析器并检查一下怎么样?例如。免费试用NH Profiler

标签: sql sql-server performance nhibernate orm


【解决方案1】:

我通过更改查询“sp_Test2”的代码解决了我的问题,这样写:

<sql-query name="sp_Test2">
   <return-scalar column="Field5" type="Int32" />
   <![CDATA[
     DECLARE @Param1 nvarchar(30)
     DECLARE @Param2 nvarchar(30)
     DECLARE @Param3 nvarchar(30)
     DECLARE @Param4 smallint

     SET @Param1 = :Param1
     SET @Param2 = :Param2
     SET @Param3 = :Param3
     SET @Param4 = :Param4

     SELECT Field5 FROM MyTable WHERE Field1 = :Param1 AND Field2 = :Param2 AND Field3 = :Param3 AND Field4 = :Param4 ORDER BY Field5
   ]]>
</sql-query>

以这种方式编写查询,没有更多的性能问题,并且存储过程和sql native的执行时间基本相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多