同一个存储过程,在SQL2008的管理器中执行,大概只要9秒中,但是用ADO.NET在程序中调用该存储过程却会超时(超过1分钟),求解?
注:用跟踪器调试过,在管理器中执行,只需要读取14W次左右,但是用程序调用却要读取超过140W次以上(仍未执行完成).
SqlCommand cmd = new SqlCommand()
{
CommandText = "[dbo].[Procedure_AssetTotal]",
CommandType = CommandType.StoredProcedure,
Connection = con,
CommandTimeout=60
};
cmd.Parameters.Add(new SqlParameter("@BeginDate", "2012-01-01"));
cmd.Parameters.Add(new SqlParameter("@EndDate", "2012-12-31"));
cmd.Parameters.Add(new SqlParameter("@UnitCode", "141"));
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
其实楼下说到的EXEC 方式也试过,结果都是超时。
最好是能把代码贴出来看看,不然不知道
另一个如果需要多次操作数据库, 应该放到一个事务里面处理
不是事务的问题,现在的主要问题就是用程序调用为什么会比在分析器中执行多读取那么多次数据
@夜风777:
程序调用只是把这段命令发送给SQL执行,和直接在SQL里执行并没有区别
你这个存储过程肯定有可以优化的地方
@Rich.T: 的确有可以优化的地方,但是也不至于调用和直接执行相差这么多吧。看到那个247W那个数值吗,就是读取次数,同一个存储过程在分析器里却只读取14W次左右,这个是问题所在。
同楼上,另外跟踪器捕获的SQL确定只执行了一次?
只执行了一次,还没有执行完,超时了
你得贴你的C#代码。
你不会是用sqlcommand("exec Procedure_AssetTotal "+p1+","+p2)
然后设置sqlcommand.commandtype="text"
这种方式运行的吗?
应该是sqlcommand("Procedure_AssetTotal")
sqlcommand.commandtype="procedure";//忘了具体的
sqlcommand.parameter.add("@p1",sqldbtype.xxxxxxxx)
两种代码都试过,结果是一样的
在C#程序里执行和在数据库查询窗口调用是速度是差不多的,肯定是你C#调用代码写的有问题!
没有存储过程无法解释啊,发上来看看,大致结构发上来就行。
建议你调试一下看看是什么情况,比如传过去的参数是不真的对
new SqlParameter("@BeginDate", "2012-01-01");
这样形式我记录 后面的"2012-01-01"这里只能是变量的,否则是不生效的,不知道你这里是怎么写的。
用Profile 把sql 抓出来 你再把这个sql 拿去执行 就知道 为什么慢了 两个sql 是不一样的
看看执行计划,想来最可能出问题的地方就是参数的类型转换,或者索引失效
数据量大的话,需要分页,用SQL管理器执行,那是在SQL服务器上处理,用程序调用,你是在用网络资源和客户机的CPU/内存\交互。