繁体   English   中英

ASP.NET ViewState vs Session,数据量大

[英]ASP.NET ViewState vs Session, big amount of data

我有一个 WebUserControl,它从 SQL 获取记录并存储在 ViewState 中,到目前为止效果很好。 但现在我有一个包含 100k+ 记录的数据集,我注意到在每次回发时 XHR 请求下载所有数据并且速度非常慢,如果我将数据存储在 Session 中则不会发生这种情况,所以我会问是否可以存储这些数据量在 session 变量中?

我的测试:

  1. Viewstate: ViewState 网络响应
  • 第一个请求读取数据并存储在 ViewState 中(时间:11 秒,大小:119MB)
  • 第二个请求是一个通用的回发,对视图状态没有任何作用,尽管如此,它还是需要很长时间才能收到回复并下载大量数据(时间:15s,大小:119MB)
  • 总计: 26s,238MB
  1. Session: Session网络响应
  • 第一个请求读取数据并存储在Session里面(Time: 7s, Size: 123kB)
  • 第二个请求是一个通用的回发,它对 Session 不做任何事情并且速度很快(时间:60 毫秒,大小:122kB)
  • 总计: 7 秒,244kB

在这个测试之后,我的意思是,将数据存储在 Session 中而不是 ViewState 中似乎要好得多,检索数据更快并且为每个请求下载更少的数据,但我不完全确定这是一个好的实践,也许我忽略了执行此操作的更好方法。 我希望这是清楚的,英语不是我的第一语言对此感到抱歉。

你说得很对。 事实上,我什至发现整个页面大小可以超过 web 配置中设置的回发限制。

但是,有两个重要问题:

正如评论中指出的那样,用那么多数据加载 session() 也是一个非常糟糕的主意。

接下来:

您真的需要在 session() 中存储那么多数据吗? 虽然您指出了巨大的性能提升 - 但您仍然在 web 服务器上施加了非常大的负载。 这将耗尽 session() memory,更糟糕的是,如果使用 sql 基于服务器的会话,那么您将在 sql 服务器上施加相当大的负载(该数据块由 .net 序列化,然后保存到 sql 中的一行服务器 session state - 这将再次成为 sql 服务器上的非常困难的负载 - 甚至“序列化”到 session 的时间也需要一些时间)。

页面上真正可以显示多少行数据? 30顶?

现在,对于几 1000 行,我什至不敢使用 ViewState。 它只会加载并使 web 页面膨胀太多。

并且只说 1000 行,以及网格视图(或列表视图)的数据分页,那么这就可以工作。

但是,超过 1000 行?

您甚至还没有关闭并在同一个 pl.net 上加载那 100k 行。 这简直是不可能的。

想想谷歌,甚至任何其他软件 - web 或桌面。

我们不会下载整个 inte.net,然后说你是否使用 ctrl-f 搜索巨大的数据页面。

这也一样。

那么,这究竟意味着什么?

您必须转储内置数据分页器,并编写自定义代码。

您可以使用最新版本的 sql 服务器(2012 年起)可以使用所谓的 sql 服务器数据分页。 所以,这意味着我们想让 SQL 服务器进行数据分页,而不是加载整个大象数据,然后尝试对该数据进行分页。 尝试一次处理这么多数据是不切实际的——至少从 UI 的角度来看是这样。

(无论如何,用户如何一次处理 100,000 行 - 这真的不可能。

这意味着,如果您的页面有 30 行? 好吧,那么您甚至不需要 ViewState 或 session。您只需从 100,000 行中拉出 30 行,您的性能就会立竿见影。 您的页面将加载(和数据页面)不到一秒钟的时间!!!

你减少了服务器上巨大的 memory 使用,你也如前所述,减少了视图 state 的大小。(你只说了 30 行 - 这样,你甚至发现让 gridview/list 视图继续使用视图 state(他们拥有的自动视图 state)。

因此,查看 sql 服务器端分页的概念。 您仍然可以将看起来像数据分页器的东西拼凑在一起,并且可以获取(计算)该表中的总行数,但您只能说一次拉出 30 行。

这里概述了这是如何工作的:

在 SQL 服务器中对结果进行分页的最佳方法是什么

如果您没有 sql 服务器 2012 或更高版本,上面的链接和帖子概述了一些替代方法。 我和 position 认为使用 2012 年更新的“分页”功能是简单的方法,尽管上面发布的一些解决方案被认为更快。

所以,你必须在这里建立一个寻呼机。 您可以自己滚动,但归根结底,内置的分页系统实际上只是为了获得更好的 UI 性能,并且实际上仅适用于大约 1000 行数据。 之后,您需要采用分页系统,您的软件和用户会因此喜欢您 - 因为一切都会像您单击鼠标一样快速响应和运行。 您甚至不需要为此采用 ajax 调用,但您必须减少从 SQL 服务器拉取的行 - 减少到 30 或 20 或您的网格一次显示的行数。

暂无
暂无

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

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