首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate和SQL查询性能问题:存储过程与本机SQL

NHibernate和SQL查询性能问题:存储过程与本机SQL
EN

Stack Overflow用户
提问于 2014-02-11 09:35:48
回答 1查看 793关注 0票数 2

在NHibernate上执行SQL查询时,我遇到了性能问题。

我试图在SQL查询中导入存储过程的SQL代码,发现性能有了很大的下降。

这是一个测试的例子..。

在我的映射文件中,我有以下两个定义:

代码语言:javascript
复制
<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的本机代码与存储过程中的本机代码完全相同。

现在,如果我像这样运行一个测试:

代码语言:javascript
复制
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。

谢谢您的任何有用的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 13:37:31

我通过修改查询"sp_Test2“的代码解决了我的问题,用这种方式编写了它:

代码语言:javascript
复制
<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本机的执行时间基本相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21698018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档