【问题标题】:How to load 1000+ items to a asp:GridView from SQL Server DB with high efficiency如何从 SQL Server DB 高效地将 1000 多个项目加载到 asp:GridView
【发布时间】:2020-01-28 02:52:59
【问题描述】:

我有一个类似下面的函数,用于根据最终用户的角色将gridview (id: dgmenu) 返回给最终用户。请注意,我不允许对 gridView 应用分页,所有项目都必须在一页中看到。

protected DataTable MenuForUserRole(string userRole) {
  DataTable dtMenus = new DataTable();
  string connectionString = constr;
  try {
    using(SqlConnection cnn = new SqlConnection(connectionString)) {
      cnn.Open();
      string query = @"Select mycolumn1, mycolumn2, mycolumn3, mycolumn4m mycolumn5
                       From mytable
                       Where mykey = (select thekey from anothertable where role = @role)
                       order by myOrderColumn;
                       ";

      SqlCommand oCmd = new SqlCommand(query, cnn);
      oCmd.Parameters.AddWithValue("@role", userRole);

      using(SqlDataAdapter a = new SqlDataAdapter(oCmd)) {
        a.Fill(dtMenus);
      }

      cnn.Close();
    }
  } catch (Exception ex) {
    throw;
  }
  return dtMenus;
}

用法:

dgMenu.DataSource = MenuForUserRole(ddlUserRoles.SelectedItem.Value.ToString());
dgMenu.DataBind();

我的问题与性能有关:返回的一些 GridView 有超过 1000 个项目,因此为这些用户加载完整的 gridView 需要 5-6 秒,这是不可接受的。当我在线搜索时,我找不到更有效的代码来从 SQL Server 数据库加载 gridView。当网格视图有大量数据时,任何可能提高加载速度的帮助或建议都将不胜感激。

已使用 -> Visual Studio 2017 和 SQL Server 2017

【问题讨论】:

  • 将在 SQL 中返回的行数限制为 200 或 300 或任何足够高性能的行,然后对其进行分页,以便他们可以单击“下一步”查看下一个 300?
  • GridViews 对于超过 100 条记录计数并不是非常有效的控件。如果不可能使用分页,只需使用普通的 HTML 表格。
  • 和往常一样 - 不要使用addwithvalue
  • 附注:查询本身,不需要做子查询;这已经是一个性能问题了。另外,我认为问题在于设置实际的DataSource 本身,原因是BaseDataList classDataView/DataGridView 等数据列表控件的抽象基类。对于每个列表,它都会创建一个独特的视图,因为每个列表都可以不同;仅此一项就很耗费资源。
  • 对于单个页面中包含 1000 多行数据的网格有什么可能的业务案例?

标签: c# asp.net .net sql-server datatable


【解决方案1】:

最有效的方法是意识到这是一个坏主意。

1000 条记录太多,任何用户都无法处理。 1-2 个数量级。这个星球上没有人可以同时处理这么多数据。这些数据在呈现给用户之前需要进行更多的过滤、分组或分页方式

这些都是您不应该在查询之后执行的操作。这些应该在查询本身中完成。检索您以后不想进行过滤的数据只会增加网络负载的基调,增加竞争条件,数据库锁定并且无论如何都可能更慢(DBMS 真的很擅长他们的工作!)。更糟糕的是,使用 ASP.Net 和它的共享内存它可以快速lead to memory issues

【讨论】:

    【解决方案2】:

    分析您的代码。了解大部分时间都花在了哪里。它可以是 SQL Server,它可以通过网络传输,它可以将数据绑定到控件。如果是 SQL Server,我们需要查看您的架构以告诉您如何提高性能。比如,你有mykey 的索引吗? BTW,别叫key,key是唯一标识记录的东西,这里显然不是这样的。

    【讨论】:

      【解决方案3】:

      使用报告(例如 Reporting Services)并创建一个链接以将数据导出到 Excel 电子表格中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        相关资源
        最近更新 更多