繁体   English   中英

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

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

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

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

在SQL Server Management Studio中执行该查询时,拉出此目录的查询将在不到一秒钟的时间内运行,但要花费十秒钟以上的时间才能在网页上呈现。 我们已经对查询进行了尽可能多的优化:仅提取将在gridview中显示的列(而不是说select * from ... ),并在查询中添加with (nolock)命令以提取不包含数据的数据等待更新,但速度仍然太慢。

我已经研究了SqlCacheDependency ,但是所有可以找到的说明都假设我正在使用SqlDataSource对象。 我无法执行此操作,因为每次用户从菜单中进行选择时,都会构造一个新查询并将其发送到数据库以精炼所显示产品的列表。

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

编辑:仅供参考,分页不是这里的选项。 我为此而努力的人在这一点上坚定不移。 我能做的最好的就是将gridview包裹在div中,并带有溢出:在CSS中自动设置。

我正在处理的表每隔几个月不会更新一次以上。 有什么办法可以在客户端缓存此信息并以这种方式使用它?

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

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

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

  3. 寻呼。 您永远不要一次拉出所有6000多个对象-哪个用户可以一次查看6000个对象? 即使理论上的超人可以处理那么多数据; 那永远不会成为您的中值用例。 一次拉50个左右(如果您确实需要那么多)或构建网站,以便始终拉动与用户相关的内容,而不是拉动所有内容(请记住,这并不是要解决的琐碎问题)

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

如果(正如您所说的那样)分页确实不是一种选择(尽管我真的对此表示怀疑;请解释一下为什么您认为分页,并且我很确定有人会找到解决方案),但实际上没有办法加快这种分页的速度操作。

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

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

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

  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,直到需要读取/写入其他数据为止。 (所有其他答案涵盖其他选项)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM