NHibernate和SQL查询性能问题:存储过程与本机SQL

时间:2014-02-11 09:35:49

标签: sql sql-server performance nhibernate orm

我在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进行此测试。

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

1 个答案:

答案 0 :(得分: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的执行时间基本相同。