2013-03-20 33 views
0

这非常奇怪。的straigthforward代码从代码到直接查询的命令执行时间

 using(SqlConnection 
     {//open connection 
      using(SqlCommand 
      {//Specified parameters and SP name 
       using(SqlDataReader reader = command.ExecuteReader()) 
       { 
        if (reader.Read()) 
        { 
        // Parse it and return an object. 

         return new MyObject 
            { 
             prop1 = (int)reader["column1"] 
             ... 

             propN=reader["columnn"].ToString() 
        } 

片可能需要多达3分钟来执行,而从管理工作室执行相同SP运行在不到一秒钟!

此代码在另一台服务器上运行。我还发现,如果从代码执行,Sql Profiler报告数百万次读取,而在Studio中执行时读取次数少于5000次。

我不知道为什么会这样。任何帮助表示赞赏。 P.S.执行计划是不是和SP绑定在一起,这意味着用户运行它的时候没有什么区别?

+0

可能内部'if(reader.Read())'内部的代码并不像你想象的那么中立。 – Steve 2013-03-20 18:02:42

+1

您可能会尝试的一件事是在从Management Studio执行时以及执行代码时运行SQL Profiler,查看它们每个从数据库明确请求的内容是否有所不同。 – David 2013-03-20 18:05:05

+0

它内部的代码很容易编辑的问题。 – Nickolodeon 2013-03-20 18:22:41

回答

0

这不是一个真正的答案,但至少可以解决它;) 运行SQL事件探查器捕获执行计划(由戴维所暗示),我发现它们在第一种和第二种情况下有所不同。 比我假设统计/索引可能存在问题 - 优化器的选项非常差。重建指数解决了问题,并且两种方式彼此接近(及时)。所以,如果你经历了这一点 - 检查索引碎片和最后更新的统计数据。