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

时间:2015-02-23 15:54:55

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

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

在页面加载时,将从数据库以及gridview的整个产品目录中查询每个下拉列表的选项。目前这个目录超过6000个项目,但我们的目标可能是应用程序上线时的五六倍。

在SQL Server Management Studio中执行时,拉取此目录的查询在不到一秒的时间内运行,但在网页上渲染需要十秒钟。我们已经按照我们所知的方式对查询进行了改进:仅提取将在gridview中显示的列(而不是说select * from ...)并将with (nolock)命令添加到查询中以进行提取数据没有等待更新,但它仍然太慢。

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

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

编辑:仅供参考,此处不能选择分页。我建立此人的人在这一点上坚定不移。我能做的最好的事情就是将gridview包装在一个带有溢出的div中:在CSS中自动设置。

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

4 个答案:

答案 0 :(得分:1)

您的大部分解决方案都会有几种形式(没有一种与Gridview有关):

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

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

  3. 寻呼。您不应该同时拉出所有6000多个对象 - 用户可以一次查看6000个对象?即使理论超人能够处理那么多数据;这永远不会成为你的中位数用例。一次拉50左右(如果你真的需要那么多)或构建你的网站,这样你总是拉动与用户相关的东西,而不是一切(请记住,这不是一个需要解决的小问题)< / p>

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

答案 1 :(得分:0)

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

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

编辑:为什么你的客户&#34;坚定不移?#34; ?为什么他们认为不可能呢?他们为什么认为这是最好的解决方案?

答案 2 :(得分:0)

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

  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
  5. 我希望它有所帮助。

答案 3 :(得分:0)

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