我在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进行此测试。
提前感谢您提供有关的任何有用信息。
答案 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的执行时间基本相同。