我有一个WebUserControl,它可以从SQL中获取记录并存储在ViewState中,到目前为止效果很好.但现在我有了一个包含100k+记录的数据集,我注意到在每次回发时,XHR请求下载所有数据,速度非常慢,如果我在会话中存储数据,这不会发生,所以我会问,在会话变量中存储这么多数据好吗?

我的测试:

  1. 视图状态:
  • 第一个请求读取数据并存储在ViewState (Time: 11s, Size: 119MB)
  • 第二个请求是一个与viewstate无关的通用回发,尽管如此,接收回复和下载大量数据需要很长时间
  • 总数:26s, 238MB
  1. 会议:
  • 第一个请求读取数据并存储在会话(Time: 7s, Size: 123kB)
  • 第二个请求是一个通用的回发,它与会话无关,而且速度很快
  • 总数:7s, 244kB

在这次测试之后,我的意思是,在会话中存储数据似乎比在ViewState中要好得多,在每次请求中检索数据和下载更少数据的速度更快,但我不完全确定这是一个好的做法,也许有更好的方法可以做到这一点,但我忽略了.我希望这是明确的,英语不是我的第一语言抱歉.

推荐答案

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

然而,有两个重要问题:

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

接下来:

您真的需要在会话()中存储那么多数据吗?虽然您指出了巨大的性能提升,但仍然给web服务器带来了很大的负载.这将消耗session()内存,更糟糕的是,如果使用基于sql server的会话,则会给sql server带来相当大的负载(该数据块由.net序列化,然后以sql server会话状态保存到一行中——这同样会给sql server带来非常大的负载——甚至"序列化"到会话的时间也需要一些时间).

一个页面上能显示多少行数据?30件上衣?

现在,对于几千行,我甚至不敢使用ViewState.它只是加载了太多的内容,让网页变得臃肿不堪.

如果只有1000行,以及网格视图(或列表视图)的数据分页,那么这就可以工作了.

但是,超过1000排?

即使在同一个星球上,你也无法装载那10万行.这根本不可能.

想想谷歌,甚至任何其他软件——网络或桌面.

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

这也一样.

那么,这到底意味着什么?

您必须转储内置的数据pager ,并编写自定义代码.

您可以使用最新版本的sql server(2012年以后)使用所谓的sql server数据分页.因此,这意味着我们希望让SQL server进行数据分页,而不是加载整个庞大的数据,然后try 分页该数据.一次try 处理这么多数据是不现实的——至少从用户界面的Angular 来看是这样.

(不管怎样,一个用户如何一次处理100000行——这真的不可能.

这意味着,如果你的页面有30行?那么,你甚至不需要ViewState或session.在10万行中,你只拉了30行,你的表现就会立竿见影.你的页面加载(和数据页面)的时间不到1秒!!!

你减少了服务器上巨大的内存使用,而且你也注意到了,减少了视图状态的大小.(你只有30行——这样,你甚至可以让gridview/list视图继续使用视图状态(它们拥有的自动视图状态).

那么,看看sql server端分页的概念吧.你仍然可以拼凑出一个看起来像数据pager 的东西,你可以得到(计数)表中的总行数,但你只能说一次 pull 30行.

这里概述了这项工作的原理:

What is the best way to paginate results in SQL Server

如果没有sql server 2012或更高版本,上面的链接和帖子概述了一些替代方法.我的观点和立场是,使用2012年更新的"分页"功能是一种简单的方法,尽管上面提到的一些解决方案速度更快.

所以,你必须在这里建立一个pager .你可以自己动手,但归根结底,内置的分页系统实际上只是为了更好的UI性能,而且实际上只适用于大约1000行数据.在那之后,你需要采用一个寻呼系统,你的软件和用户会因此而喜欢你——因为一切都会以你点击鼠标所能达到的速度响应和运行.您甚至不需要为此采用ajax调用,但必须将从SQL server中提取的行数减少到30或20行,或者减少网格一次显示的行数.

Sql相关问答推荐

SQL—如何在搜索的元素之后和之前获取元素?

SQL(PostgreSQL)从条件创建点表

如果开始期间不存在PostgresSql回填数据

Django将字符串筛选为整数?

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

查询页面推荐

动态组/转置

MS Access问题查询中的自定义字段

按属性值 Select 数组元素Postgres Jsonb

基于开始/结束日期重叠的BigQuery突发行

如何使用聚合连接两个表

连续天跟踪购买情况(将标记返回到另一列?)

Postgres,使用 select 插入多个值

在 Oracle 21c 中透视文本值

如何在sparksql查询中使用日期值?

按所选的值将记录分组到不同的列中

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

Postgres 条件求和函数

使用一组值进行分组和计数

BigQuery 将一行拆分为多列