首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求SQL施行与程序执行效率分析

2013-03-10 
求SQL执行与程序执行效率分析版本sql2008,写了一个存储过程,语句相当复杂,用于很多临时表将结果集中起来.

求SQL执行与程序执行效率分析
版本sql2008,写了一个存储过程,语句相当复杂,用于很多临时表将结果集中起来.

我直接在sql查询分析里执行:EXEC 存储过程名字 '201302','20130116','20130219','Y'  (执行时间大约27秒可以完成)


同样,我用vs2008,.net2.0编译的程序,执行如下方法,只看"断点位置"时间,超过5分钟都不出结果,看任务样进程时,程序未响应.

public DataSet GetDataSet(string strSql, CommandType cmdType, params SqlParameter[] param)
        {
            using (SqlConnection con = new SqlConnection(connectionStr))
            {
                SqlDataAdapter sda = null;
                try
                {
                    con.Open();
                    SqlCommand com = new SqlCommand(strSql, con);//strSql参数为:EXEC 存储过程名字 '201302','20130116','20130219','Y'  
                    com.CommandTimeout = 0;   
                       com.CommandType = cmdType;
                    com.Parameters.AddRange(param);
                    sda = new SqlDataAdapter(com);
                    DataSet ds = new DataSet();
                    sda.Fill(ds,"myDs");//断点位置
                    return ds;
                }
                catch (SqlException ex)
                {
                    throw new Exception("SQL数据库连接失败,执行DataSet查询产生错误: " + ex.Message);
                }
                finally
                {
                    sda.Dispose();
                    con.Close();
                }
            }
        }


咨询大家,为什么两种查询分式差别这么大?程序该如何优化?


[解决办法]
2个不同方式是在同一台机器? 有错误提示吗?
[解决办法]
你这个sda.Fill(ds,"myDs")要返回整个记录集?那数据量大的话,内存都不够用,还不就是死了。
[解决办法]
数据大概有多少行?不调试,直接运行时间大概是多少(前后写两行日志看一下时间)?
[解决办法]
存储过程有访问其他Server DB?
[解决办法]
执行效率分析只能现场调试,光看这些代码是不能分析的。
你可以启用SqlServer自带的跟踪分析工具,监视两者最终执行的语句有无差别,如果产生细微的差别,你再到sql查询分析里模拟这个差别执行下。
你还可以跟踪SQL进程,看各自占用的资源情况,程序执行的时候,资源是否用足了。
[解决办法]
你给出存储过成吧。

你存储过程都30秒钟,程序那里肯定是无响应了。

程序调用本来就慢,在加上网络原因,sql执行返回时间,出不来是正常的。

你只能优化你的sql、存储过程。
[解决办法]
存储过程慢的话程序调用肯定更慢,贴存储过程吧。
[解决办法]
存储过程处理数据一定先做筛选。你处理的数据大概有多少???

如果主表数据量巨大,你把筛选出的数据放到表变量,临时表,这个看你筛选的数据多少

然后在关联其它表。

你所操作表有索引吗,处理数据是否用到了索引,写的条件是否没用到索引而引起全表扫描。

检查你写的存储过程吧。


[解决办法]
把代码写在数据库里和程序里,如果没有数据的往返的话(或数据量很少的情况)两者所花的时间是没有什么却别的,如果往返的数据量大,时间就会相差很大了。
在数据库中执行,数据直接调用计算;程序中执行,需要将数据从数据库中调出来传到程序,然后程序计算出结果返回数据库等
[解决办法]
语句没问题,只跟连接字符串,packet size有关,你可以改改packet size=1024

热点排行