2013-02-25 311 views
1

我使用数据表作为页面上某些下拉菜单的数据源,但注意到在回发期间页面非常缓慢。DataTable加载非常缓慢

我已经跟踪它通过在这里:

DataTable dt = new DataTable(); 
dt.Load(sqlCmd.ExecuteReader()); // this takes ages 

SQL命令是一个parametrised查询,而不是存储过程(返回值和地方都相当“动态”所以这不会是可行的),但仍然是一个简单的选择联合查询。 每个下拉菜单通常会返回5到20个选项,具体取决于其他下拉菜单中选择的内容。 当我在管理工作室中运行查询时,它在一秒钟内完成。在这里,每个下拉菜单最多可能需要7秒钟,页面上的6个下拉菜单很快就会累计起来。 我也试图与一个SqlDataAdapter:

SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd); 
sqlDa.Fill(dt); // this takes ages 

但这只是慢。 我在2个不同的系统上有这个,并且都有相同的性能问题。

如果有人知道更好(更快)的方法,或知道为什么这是如此缓慢,将是伟大的。

+1

请稍微多一些上下文和代码。代码位于何处,是静态的,单个用户的开发服务器上的页面是否也很慢? – 2013-02-25 19:46:25

+0

你可以展示更多的代码,例如SQL查询是什么样子的。也许你在查询本身中有一些低效率的代码 – MethodMan 2013-02-25 19:56:54

+0

@DJKRAZE:当它返回5-20条记录时,查询是否有责任并且是7次SSMS更快? – 2013-02-25 20:01:36

回答

1

不是我已经看到了这个问题的最好的线程,但有良好的关系里面,&它在我的帖子历史:

SQL Query that runs fine in SSMS runs very slow in ASP.NET

的SQL优化器有时喜欢来决定什么是最好的&你”必须通过追踪和记录数据执行计划来打破查询。它可能被埋在一个不好的索引中,或者你的查询代码可能需要优化。看到我们没有查询代码,并且它可能会或可能没有帮助。我建议你按照上面的帖子中链接的指南并关闭你的问题。

+0

所以我终于找到了问题,有人删除了我的索引。我重新添加了它们,并且一切都很快地再次运行。为什么这只会导致c#中的性能问题,而不会导致SSMS的性能问题我将留给更大的支持 – jimmy 2013-03-06 10:08:58

+0

SSMS缓存您的查询,第一次可能运行缓慢,然后每次都快速,因为难以复制问题。 – RandomUs1r 2013-03-06 16:05:46

0

这里是如何加载DataTable的例子很快注意到我如何显示特定Columns,我想回到

private DataTable GetTableData() 
{ 
    string sql = "SELECT Id, FisrtName, LastName, Desc FROM MySqlTable"; 
    using (SqlConnection myConnection = new SqlConnection(connectionString)) 
    { 
    using (SqlCommand myCommand = new SqlCommand(sql, myConnection)) 
    { 
     myConnection.Open(); 
     using (SqlDataReader myReader = myCommand.ExecuteReader()) 
     { 
     DataTable myTable = new DataTable(); 
     myTable.Load(myReader); 
     myConnection.Close(); 
     return myTable; 
     } 
    } 
    } 
} 

如果你想使用DataAdapterFill the DataTable这里是一个简单的例子

private void FillAdapter() 
{ 
    using (SqlConnection conn = new SqlConnection(Your ConnectionString)) 
    { 
     conn.Open(); 
      using (SqlDataAdapter dataAdapt = new SqlDataAdapter("SELECT * FROM EmployeeIDs", conn)) 
     { 
     DataTable dt = new DataTable(); 
     dataAdapt.Fill(dt); 
     // dataGridView1.DataSource = dt;//if you want to display data in DataGridView 
     } 
    } 
}