在没有 SqlDataSource 对象的情况下加快查询速度的方法 SQL Server 2008 R2

Ways to speed up queries SQL Server 2008 R2 without SqlDataSource object

我正在尝试使用 ASP.NET 和 C# 构建一个产品目录应用程序,它允许用户从一系列下拉菜单中选择 select 产品属性,以及相关的列表出现在网格视图中的产品。

在页面加载时,从数据库中查询每个下拉菜单的选项,以及 gridview 的整个产品目录。目前这个目录有 6000 多个项目,但当应用程序上线时,我们看到的可能是这个数量的五到六倍。

在 SQL Server Management Studio 中执行时,提取此目录的查询运行不到一秒,但在网页上呈现需要十多秒。我们尽可能地改进了查询:仅拉取将显示在我们的 gridview 中的列(而不是说 select * from ...)并将 with (nolock) 命令添加到查询中以拉取数据而无需等待更新,还是太慢了

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

我在这里无法理解,所以我希望有人能提供一些见解。如果您需要更多信息,请告诉我,我会尽可能更新。

编辑:仅供参考,这里不能选择分页。我为之建造的人在这一点上立场坚定。我能做的最好的事情就是将 gridview 包装在 div 中,并在 CSS.

中设置 overflow: auto

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

如果真的像你说的分页不是一个选项(虽然我真的怀疑它;请解释你为什么这么认为,我很确定有人会找到解决方案),那真的没有办法加快这种操作。

如您所见,耗时的不是查询,而是数据传输。将数据从一个内存 space (sql) 复制到另一个内存(您的应用程序)并没有那么快,并且显示此数据要慢几个数量级。

编辑:为什么你的客户是 "firm on that point"?为什么他们认为否则就不可能?为什么他们认为这是最好的解决方案?

您的大部分解决方案将以几种形式出现(none 其中与 Gridview 有关):

  1. 好的索引。为提取此数据的 table 创建良好的索引;好的索引定义为:

    • 索引存储的信息与显示产品实际需要的信息一样少。存储的数据量越小,在SQL服务器中每8K页可以存储的数据量就越大。
    • 覆盖索引:您的 SQL 查询应该完全符合您的需要(而不是 SELECT *)并且您的索引应该被构建以覆盖该查询(因此它被称为 'covering index' )
  2. 良好的table结构:这与索引一致。提取信息所需的连接越少,提取信息的速度就越快。

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

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

有很多选项可以在网格上显示大量数据,但第三方软件。 尝试将 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

希望对您有所帮助。

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