【问题标题】:Improving nested objects filtering speed提高嵌套对象过滤速度
【发布时间】:2012-10-05 19:52:02
【问题描述】:

这是我遇到的一个问题(简化示例): 假设我有几张桌子:

一个客户可以拥有多种产品,而一种产品可以具有多种功能。

在我的 asp.net 前端,我有一个包含客户信息的网格:

类似这样的:

Name   Address   
John   222 1st st     
Mark   111 2nd st 

我需要的是按功能过滤客户的能力。因此,我有一个与客户相关的可用功能的下拉列表。

我目前在做什么:
1. 我从存储过程中返回了DataTable 的客户。我将它存储在视图状态中
2. 我从存储过程返回DataTable 与客户相关的功能。我将它存储在视图状态中 3. 在选择过滤器时,我再次使用新的 feature_id 过滤器运行存储过程,在该过滤器中我再次加入以仅显示已选择功能的客户。

我的问题:速度很慢。

我认为可能的解决方案是:
1. 在页面加载时,在一个视图状态变量中返回所有数据。所以基本上是三个嵌套对象列表。这将使我的页面加载缓慢。 2. 以某种聪明的方式执行 async loazing。怎么样?

有更好的解决方案吗?

编辑:
这是一个简化的示例,因此我还需要按通过 6 个表连接到表 Customer 的属性过滤客户。

【问题讨论】:

  • 您在 ViewState 中存储了整个客户列表?是的......可能不是最好的主意。另外,你说,“我的问题:它很慢。”哪一部分?你列出了 3 个步骤,哪个部分慢?
  • @aquinas,在视图状态中存储整个内容很慢,而且每个过滤操作也很慢,因为它会返回到 db。
  • 为什么不能等待用户选择功能,然后从数据库中选择具有该功能的客户。即,做一个分贝旅行?例如,select * from cutomers where customerid in (select customerid from customerproduct natural join product natural join feature where featureid='whateverTheUserSelected')
  • @keyboardP,是的,它有所有正确的索引。
  • @aquinas,因为我需要加载与客户相关的所有功能,所以还有更多的行程。另外,我想默认显示所有客户信息。此外,没有表 customerfeature。

标签: c# asp.net performance c#-4.0 webforms


【解决方案1】:

我处理这些场景的方法是将 Xml 传递给 SQL,然后针对它运行一个连接。所以 Xml 看起来像:

<Features><Feat Id="2" /><Feat Id="5" /><feat Id="8" /></Features>

然后您可以将该 Xml 传递给 SQL(取决于 SQL 的版本有不同的方法),但在较新的版本中它比以前容易得多:

http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty

另外,不要将任何内容放在 ViewState 中;真的没有理由这样做。

【讨论】:

    【解决方案2】:

    在 ViewState 中存储整个客户列表将会非常缓慢;在 ViewState 中存储所有客户的所有信息会变得更糟,除非您的整个客户群非常小,比如大约 30 条记录。

    首先,为什么要将所有客户加载到 ViewState 中?如果您有大量客户,请一次加载一页数据。这至少会减少通过网络传输的数据量,也可能会加快您的存储过程。

    在您的位置上,我会首先专注于优化数据检索(包括最小化您返回的数量),然后关注更快的存储和显示方式。如果您遇到阻止这种情况的异常限制(非常慢的数据库;没有分析工具;不允许更改存储过程),请告诉我们。

    【讨论】:

    • 感谢您的建议。基本上我的想法是将所有项目存储在视图状态中,因为我可以在不返回数据库的情况下过滤客户。并且只是调整我的数据表。
    【解决方案3】:

    解决方案 1:在查询中包含您需要过滤的任何条件,仅返回和呈现请求的记录。无需使用视图状态。

    解决方案2:检索一些合理的客户页面限制,在浏览器上使用javascript进行过滤。允许轻松导航到下一页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2013-09-01
      相关资源
      最近更新 更多