首页 新闻 会员 周边 捐助

存储过程效率问题

0
悬赏园豆:50 [待解决问题]

同一个存储过程,在SQL2008的管理器中执行,大概只要9秒中,但是用ADO.NET在程序中调用该存储过程却会超时(超过1分钟),求解?

注:用跟踪器调试过,在管理器中执行,只需要读取14W次左右,但是用程序调用却要读取超过140W次以上(仍未执行完成).

问题补充:
 
 
exec [dbo].[Procedure_AssetTotal] @BeginDate=N'2012-01-01',@EndDate=N'2012-12-31',@UnitCode=N'141'
 
忘记说了,要查询的数据量比较大,大概有100W条左右,这个存储过程比较大不方便贴。
主要的功能就是根据这些数据生成一张综合数据表。
 
这个是在分析器里面直接执行的结果,时间9秒
c#代码:

            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的主页 夜风777 | 初学一级 | 园豆:137
提问于:2012-12-12 15:35
< >
分享
所有回答(9)
0

最好是能把代码贴出来看看,不然不知道

 

另一个如果需要多次操作数据库, 应该放到一个事务里面处理

Rich.T | 园豆:3440 (老鸟四级) | 2012-12-12 15:43

不是事务的问题,现在的主要问题就是用程序调用为什么会比在分析器中执行多读取那么多次数据

支持(0) 反对(0) 夜风777 | 园豆:137 (初学一级) | 2012-12-12 16:08

@夜风777: 

程序调用只是把这段命令发送给SQL执行,和直接在SQL里执行并没有区别

你这个存储过程肯定有可以优化的地方

支持(0) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2012-12-12 16:12

@Rich.T: 的确有可以优化的地方,但是也不至于调用和直接执行相差这么多吧。看到那个247W那个数值吗,就是读取次数,同一个存储过程在分析器里却只读取14W次左右,这个是问题所在。

支持(0) 反对(0) 夜风777 | 园豆:137 (初学一级) | 2012-12-12 16:15
0

同楼上,另外跟踪器捕获的SQL确定只执行了一次?

johnMing | 园豆:223 (菜鸟二级) | 2012-12-12 15:50

只执行了一次,还没有执行完,超时了

支持(0) 反对(0) 夜风777 | 园豆:137 (初学一级) | 2012-12-12 16:07
0

你得贴你的C#代码。

Launcher | 园豆:45050 (高人七级) | 2012-12-12 16:29
0

你不会是用sqlcommand("exec Procedure_AssetTotal "+p1+","+p2)

然后设置sqlcommand.commandtype="text"

这种方式运行的吗?

应该是sqlcommand("Procedure_AssetTotal")

sqlcommand.commandtype="procedure";//忘了具体的

sqlcommand.parameter.add("@p1",sqldbtype.xxxxxxxx)

 

飞来飞去 | 园豆:2057 (老鸟四级) | 2012-12-12 16:57

两种代码都试过,结果是一样的

支持(0) 反对(0) 夜风777 | 园豆:137 (初学一级) | 2012-12-12 17:38
0

在C#程序里执行和在数据库查询窗口调用是速度是差不多的,肯定是你C#调用代码写的有问题!

勇哥哥 | 园豆:206 (菜鸟二级) | 2012-12-12 17:15
0

没有存储过程无法解释啊,发上来看看,大致结构发上来就行。

苏飞 | 园豆:2024 (老鸟四级) | 2012-12-12 17:30

建议你调试一下看看是什么情况,比如传过去的参数是不真的对

new SqlParameter("@BeginDate", "2012-01-01");

这样形式我记录 后面的"2012-01-01"这里只能是变量的,否则是不生效的,不知道你这里是怎么写的。

支持(0) 反对(0) 苏飞 | 园豆:2024 (老鸟四级) | 2012-12-12 17:44
0

用Profile  把sql 抓出来 你再把这个sql 拿去执行 就知道 为什么慢了 两个sql 是不一样的

Tom.汤 | 园豆:3060 (老鸟四级) | 2012-12-13 10:01
0

看看执行计划,想来最可能出问题的地方就是参数的类型转换,或者索引失效

luofer | 园豆:468 (菜鸟二级) | 2013-02-21 18:13
0

数据量大的话,需要分页,用SQL管理器执行,那是在SQL服务器上处理,用程序调用,你是在用网络资源和客户机的CPU/内存\交互。

 

Shannon | 园豆:611 (小虾三级) | 2014-03-04 19:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册