我尝试在ASP.NET和C#中构建产品目录应用程序,允许用户从一系列下拉菜单中选择产品属性,并在gridview中显示相关产品列表。
在页面加载时,将从数据库以及gridview的整个产品目录中查询每个下拉列表的选项。目前这个目录超过6000个项目,但我们的目标可能是应用程序上线时的五六倍。
在SQL Server Management Studio中执行时,拉取此目录的查询在不到一秒的时间内运行,但在网页上渲染需要十秒钟。我们已经按照我们所知的方式对查询进行了改进:仅提取将在gridview中显示的列(而不是说select * from ...
)并将with (nolock)
命令添加到查询中以进行提取数据没有等待更新,但它仍然太慢。
我已查看SqlCacheDependency
,但我能找到的所有指示都假设我使用了SqlDataSource
个对象。我无法做到这一点,因为每次用户从菜单中进行选择时,都会构建一个新查询并将其发送到数据库以优化显示的产品列表。
我离开了我的深度,所以我希望有人可以提供一些见解。如果您需要更多信息,请告诉我,我会尽快更新。
编辑:仅供参考,此处不能选择分页。我建立此人的人在这一点上坚定不移。我能做的最好的事情就是将gridview包装在一个带有溢出的div中:在CSS中自动设置。
我所处理的表格每隔几个月就不会更新一次,如果是这样的话;有没有办法在客户端缓存这些信息并以这种方式使用它?
答案 0 :(得分:1)
您的大部分解决方案都会有几种形式(没有一种与Gridview有关):
好的索引。为提取此数据的表创建良好的索引;好的索引定义为:
SELECT *
),并且应该构建索引来覆盖该查询(因此它被称为“覆盖索引”)良好的表格结构:这与索引一致。拉取信息所需的连接越少,就越快拉动它。
寻呼。您不应该同时拉出所有6000多个对象 - 用户可以一次查看6000个对象?即使理论超人能够处理那么多数据;这永远不会成为你的中位数用例。一次拉50左右(如果你真的需要那么多)或构建你的网站,这样你总是拉动与用户相关的东西,而不是一切(请记住,这不是一个需要解决的小问题)< / p>
分页的美妙之处在于您的客户甚至不需要知道您已经实现了分页。一种这样的技术称为“Infinite Scrolling”。有了它,您可以继续在客户滚动到它们的同时获取下一行N
行。
答案 1 :(得分:0)
如果你正在说分页真的不是一个选项(虽然我真的怀疑它;请解释你为什么这么认为,我很确定有人会找到解决方案),那里&# 39;真的没办法加快这种行动。
正如您所注意到的那样,这不是长时间的查询,而是数据传输。将数据从一个内存空间(sql)复制到另一个内存空间(您的应用程序)的速度并不快,并且显示此数据的速度要慢几个数量级。
编辑:为什么你的客户&#34;坚定不移?#34; ?为什么他们认为不可能呢?他们为什么认为这是最好的解决方案?
答案 2 :(得分:0)
有许多选项可以显示网格上的大量数据,但第三方软件。 尝试使用带有ajax调用的jquery / javascript网格。它将帮助您在客户端上呈现大量行。即使您可以使用缓存也不会多次查询数据库。 这些是一个很好的网格,可以帮助您在Web浏览器上显示数千行:
答案 3 :(得分:0)
当应用程序(网页)启动时,您可以使用后台线程将所有行加载到客户端上的Datatable中。然后只使用数据表来填充你的网格等....所以你不必再次点击SQL,直到你需要读/写不同的数据。 (所有其他答案涵盖其他选项)