【发布时间】:2014-02-11 09:35:48
【问题描述】:
我在 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 进行此测试。
提前感谢您提供任何有用的信息。
【问题讨论】:
-
我在你的测试中没有看到预热,我想当你反转你的测试时,你会得到相反的结果。
-
我颠倒了测试,但结果是一样的……第一次运行大约 20 秒(sp_Test2),第二次运行大约 1 秒(sp_Test1)
-
安装一个分析器并检查一下怎么样?例如。免费试用NH Profiler
标签: sql sql-server performance nhibernate orm