ASP.NET ViewState vs Session,数据量大

ASP.NET ViewState vs Session, big amount of data

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

我的测试:

  1. 视图状态: ViewState Network Response
  1. 会话: Session Network Response

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

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

但是,有两个重要问题:

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

下一个:

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

而你真正能在一个页面上显示多少行数据? 30 顶?[​​=11=]

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

而且只有1000行,网格视图(或列表视图)的数据分页,这就可以了。

但是,超过 1000 行?

加载那 100k 行甚至不在同一个星球上。根本谈不上。

考虑 Google,甚至任何其他软件 - Web 或桌面。

我们不下载整个互联网,然后说你有没有使用 ctrl-f 来搜索巨大的数据页面。

这个也是一样。

那么,这到底是什么意思?

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

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

(一个用户怎么可能一次处理 100,000 行——这真的不可能。

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

并且您减少了服务器上的大量内存使用,并且您还如前所述减少了视图状态的大小。 (你只能说 30 行 - 这样,你甚至发现让 gridview/list 视图继续使用视图状态(它们拥有的自动视图状态)。

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

此处概述了其工作原理:

What is the best way to paginate results in SQL Server

以上 link 和 post 概述了一些替代方法,如果您没有 sql server 2012 或更高版本。我的观点和立场是,使用 2012 年更新的“分页”功能是一种简单的方法,尽管上面提到的一些解决方案 posted 甚至更快。

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