首页 > 代码库 > 关于Set Nocount ON的性能 |c#调用存储过程的返回值总是-1

关于Set Nocount ON的性能 |c#调用存储过程的返回值总是-1

 

也许因为它太过于简单,自己一直没能好好关注这个语句,只记得"只是"提高点性能而已.有时会在存储过程中写上几句,有时也会懒得去敲这几个字母.但是.他们SET NOCOUNT ON 和SET NOCOUNT OFF 之间到底有多大的区别吗?前天一时好奇.终于想弄清楚他们之间性能有多大区别.在google一遍,找了几篇文章.我们可以得出一些结论.

How NOCOUNT affects ADO.NET(NOCOUNT对ADO.NET影响多大)by Jon Galloway
在文章的评论有一段测试的代码,大家可以复制到查询分析器进行测试.基本上,SET NOCOUNT ON比OFF更快点(但我测试的结果不是很理想,基本上二者相差不是太大,更夸张是文章下面的评论:
I want to share my experience with NOCOUNT.
A stored procedure who joins a few tables with more than 100.000 rows is very slow if you run it with ADO.NET and with option NOCOUNT ON. By setting NOCOUNT OFF the same procedure will be 10 times faster.
There is no difference if you execute this procedure from the Management Studio with NOCOUNT OFF or ON
MY GOD!
 Seeing Is Believing 

基本上他们的结论是:使用NOCOUNT能够减少网络的传输.当我们SET NOCOUNT ON时执行的存储过程每执行sql语句(像 SELECT, INSERT, UPDATE, DELETE)时会忽略向客户端发送DONE_IN_PROC消息.
如果我们判断Update更新数据是否成功时,最简便的方法就是ExecuteNonQuery()>0.在使用SET NOCOUNT ON时,ExecuteNonQuery总是返回-1.一个很好的解决方法就是使用out parameter方式来输出是否成功 it uses the rows affected result to determine if the update succeeded.

另外有一篇T-SQL 编码标准是一篇不错的文章.非常值得一读.

原文地址:http://www.cnblogs.com/cnzc/archive/2007/09/01/878434.html

--------------------------------------------------------------------------

   public virtual int GetMenuByRID(Nullable<int> rID)
        {
            var rIDParameter = rID.HasValue ?
                new ObjectParameter("RID", rID) :
                new ObjectParameter("RID", typeof(int));
    
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("GetMenuByRID", rIDParameter);
        }

ObjectContext.ExecuteFunction 这个返回的是影响的行数 

关于Set Nocount ON的性能 |c#调用存储过程的返回值总是-1