在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的本机代码与存储过程中的本机代码完全相同。
现在,如果我像这样运行一个测试:
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。
谢谢您的任何有用的信息。
发布于 2014-03-01 13:37:31
我通过修改查询"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本机的执行时间基本相同。
https://stackoverflow.com/questions/21698018
复制相似问题