ASP.NET ViewState vs Session,数据量大
ASP.NET ViewState vs Session, big amount of data
我有一个 WebUserControl,它从 SQL 获取记录并存储在 ViewState 中,到目前为止它运行良好。但现在我有一个包含 100k+ 记录的数据集,我注意到在每次回发时,XHR 请求都会下载所有数据并且速度非常慢,如果我将数据存储在 Session 中则不会发生这种情况,所以我会问是否可以存储这些数据量在会话变量中?
我的测试:
- 视图状态:
ViewState Network Response
- 第一个请求读取数据并存储在ViewState中(时间:11s,大小:119MB)
- 第二个请求是一个普通的回发,对视图状态没有任何作用,尽管如此,它需要很长时间才能收到回复并下载大量数据(时间:15s,大小:119MB )
- 总计:26 秒,238MB
- 会话:
Session Network Response
- 第一个请求读取数据并存储在Session中(时间: 7s, 大小: 123kB)
- 第二个请求是一个通用的回发,它不对会话做任何事情并且速度很快(时间:60 毫秒,大小:122kB)
- 总计:7 秒,244kB
在这次测试之后,我的意思是,将数据存储在 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 或您的网格一次显示多少行.
我有一个 WebUserControl,它从 SQL 获取记录并存储在 ViewState 中,到目前为止它运行良好。但现在我有一个包含 100k+ 记录的数据集,我注意到在每次回发时,XHR 请求都会下载所有数据并且速度非常慢,如果我将数据存储在 Session 中则不会发生这种情况,所以我会问是否可以存储这些数据量在会话变量中?
我的测试:
- 视图状态: ViewState Network Response
- 第一个请求读取数据并存储在ViewState中(时间:11s,大小:119MB)
- 第二个请求是一个普通的回发,对视图状态没有任何作用,尽管如此,它需要很长时间才能收到回复并下载大量数据(时间:15s,大小:119MB )
- 总计:26 秒,238MB
- 会话: Session Network Response
- 第一个请求读取数据并存储在Session中(时间: 7s, 大小: 123kB)
- 第二个请求是一个通用的回发,它不对会话做任何事情并且速度很快(时间:60 毫秒,大小:122kB)
- 总计:7 秒,244kB
在这次测试之后,我的意思是,将数据存储在 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 或您的网格一次显示多少行.