【问题标题】:Ways to speed up queries SQL Server 2008 R2 without SqlDataSource object在没有 SqlDataSource 对象的情况下加快查询 SQL Server 2008 R2 的方法
【发布时间】:2015-02-23 15:54:54
【问题描述】:

我正在尝试在 ASP.NET 和 C# 中构建产品目录应用程序,该应用程序将允许用户从一系列下拉菜单中选择产品属性,并在网格视图中显示相关产品列表。

页面加载时,从数据库中查询每个下拉菜单的选项,以及网格视图的整个产品目录。目前,该目录包含 6000 多个项目,但我们正在查看可能是应用程序上线时的五六倍。

提取此目录的查询在 SQL Server Management Studio 中执行时运行时间不到一秒,但在网页上呈现需要十秒以上。我们已经尽我们所能优化了查询:只提取将在我们的 gridview 中显示的列(而不是说select * from ...)并将with (nolock) 命令添加到查询中以在不等待更新的情况下提取数据,但还是太慢了。

我查看了SqlCacheDependency,但我能找到的所有方向都假设我使用的是SqlDataSource 对象。我不能这样做,因为每次用户从菜单中进行选择时,都会构建一个新查询并将其发送到数据库以优化显示的产品列表。

我在这里超出了我的深度,所以我希望有人可以提供一些见解。如果您需要更多信息,请告诉我,我会尽快更新。

编辑:仅供参考,分页不是这里的选项。我为之建造的人在这一点上坚定不移。我能做的最好的是将gridview包装在一个div中,溢出:在CSS中自动设置。

如果是这样的话,我正在处理的表不会每隔几个月更新一次以上;有没有办法在客户端缓存这些信息并以这种方式使用它?

【问题讨论】:

  • 您应该只加载尽可能多的行 - 查看 paging - 加载 top 50 左右的行 - 不是全部6000!!
  • 假设没有输入过滤条件。您是否想同时展示所有 6,000 种产品?为什么?用户不需要一次查看 6,000 个产品。相反,允许用户对数据进行分页,并且只从数据库中检索必要的数据以显示一页的产品价值。
  • @bmurrell30:分页不是一个选项?为什么?
  • 绘制 6.000 行永远不会很快。您应该考虑另一种方法(按需滚动,过滤......等)。分页应该是一种选择,因为..我从未遇到过可以在网页上处理 6000 行的用户...
  • 问题不在于 Sql Server、查询、表等。您的问题是您想要:通过网络(sql-Server 到您的 IIS)带来 6.000 行,然后将其绘制到网络-页。处理和渲染的数据量过多。这不是一个好习惯。如果您想在不分页或滚动需求的情况下查看 6.000 行,请将您的应用程序更改为 Winforms(甚至很难使用 6.000 行)。

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


【解决方案1】:

您的大多数解决方案将采用几种形式(都与 Gridview 无关):

  1. 良好的索引。为提取这些数据的表创建良好的索引;好的索引定义为:

    • 存储的信息与显示产品实际所需的信息一样少。存储的数据量越小,SQL Server 中每 8K 页可以存储的数据量就越大。
    • 覆盖索引:您的 SQL 查询应该与您需要的完全匹配(而不是 SELECT *),并且您的索引应该构建为覆盖该查询(因此称为“覆盖索引”)
  2. 良好的表结构:这与索引一起使用。拉取信息所需的连接越少,拉取信息的速度就越快。

  3. 分页。您不应该一次拉出所有 6000 多个对象——什么用户可以一次查看 6000 个对象?即使理论上的超人可以处理那么多数据;那永远不会成为您的中位数用例。一次拉 50 个左右(如果您真的需要那么多)或构建您的网站,以便您始终拉取与用户相关的内容,而不是所有内容(请记住,这不是一个需要解决的小问题)

分页的美妙之处在于,您的客户甚至不需要知道您已经实现了分页。一种这样的技术称为“Infinite Scrolling”。有了它,您可以在客户滚动到它们时继续获取下一个 N 行。

【讨论】:

  • 这个“无限滚动”的东西听起来很有希望——你让我在“看起来不像分页的分页”。我会对此进行调查并回复您。
  • 您为“无限滚动”提供的 URL 返回 404 错误。我认为这是您要指向的页面:sitepoint.com/implementing-infinite-scroll-jquery/…
  • 对不起,我在火车上;所以一直为我下降。是的,这就是链接(我从 Google 搜索结果中选择了顶部的链接。可能有更多更好的选择;但是如果没有你的具体细节,我只能做更多)。
  • 无限滚动原来是要走的路;我找到了一种方法来做到这一点,而无需完全重建我的项目,所以我正在追求它。不过,它打开了一个全新的猫袋,所以我要开始一个新线程。将此标记为已回答,因为您让我开始了。
  • 这是new thread的链接
【解决方案2】:

如果,正如您所说,分页确实不是一种选择(尽管我真的怀疑它;请解释您为什么认为它是,我很确定有人会找到解决方案),真的没有办法加快速度搞这种操作。

正如您所注意到的,需要很长时间的不是查询,而是数据传输。将数据从一个内存空间 (sql) 复制到另一个内存空间 (您的应用程序) 并没有那么快,并且显示这些数据的速度要慢几个数量级。

编辑:为什么您的客户“在这一点上坚定”?为什么他们认为否则不可能?为什么他们认为这是最好的解决方案?

【讨论】:

  • 很公平。请查看我的编辑,了解为什么不能选择分页。
  • 正如我编辑的那样,您能否详细说明为什么他们认为这不是一个选项?也许他们认为“我想以这种方式工作”,即使有分页(或无限滚动或其他),也有可能通过某种解决方法。
  • 他们只想在页面加载时显示整个目录;多个消息来源警告我,分页结果将被强烈拒绝(确切的词是:“他们会翻出来”)。我同意这将是最好的选择,但我不能那样做,我正在寻找替代方案。
  • 我了解您想取悦您的客户,但了解他们为什么对您强加“失败”的方法可能会让您对可能的解决方案有所了解。通过深入挖掘客户的需求,我有时会发现他们真正需要的根本不是他们最初提出的要求,或者可以通过更简单的方式解决。你不能和他们谈谈吗?
【解决方案3】:

有许多选项可以在网格上显示大量数据,但第三方软件除外。 尝试将 jquery/javascript 网格与 ajax 调用一起使用。它将帮助您在客户端上呈现大量行。即使您可以使用缓存来多次查询数据库。 这些是一个很好的网格,可以帮助您在网络浏览器上显示数千行:

  1. http://www.trirand.com/blog/
  2. https://github.com/mleibman/SlickGrid
  3. http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx
  4. http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records

希望对你有帮助。

【讨论】:

    【解决方案4】:

    当应用程序(网页)启动时,您可以使用后台线程将所有行加载到客户端上的数据表中。然后只使用 Datatable 来填充您的 Grids 等......所以在您需要读取/写入不同的数据之前,您不必再次点击 SQL。 (所有其他答案都涵盖了其他选项)

    【讨论】:

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