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进行此测试。
非常感谢您提供任何有用的信息。
我在你的测试中看不到热身,我想你在逆转你的测试时,会有相反的结果。 – Peter
我颠倒了测试,但结果是一样的......第一次运行约20秒(sp_Test2),第二次运行约1秒(sp_Test1) –
如何安装探查器并检查它?例如。 [NH Profiler]的免费试用版(http://www.hibernatingrhinos.com/products/NHProf) –