2014-02-11 17 views
1

我有一个执行NHibernate的SQL查询的性能问题。NHibernate和SQL查询性能问题:存储过程vs本机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进行此测试。

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

+0

我在你的测试中看不到热身,我想你在逆转你的测试时,会有相反的结果。 – Peter

+0

我颠倒了测试,但结果是一样的......第一次运行约20秒(sp_Test2),第二次运行约1秒(sp_Test1) –

+0

如何安装探查器并检查它?例如。 [NH Profiler]的免费试用版(http://www.hibernatingrhinos.com/products/NHProf) –

回答

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本机。