首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何处理数据库中的大量结果集

如何处理数据库中的大量结果集
EN

Stack Overflow用户
提问于 2008-10-23 14:35:07
回答 10查看 15.3K关注 0票数 6

我正在设计一个多层数据库驱动的web应用程序- SQL关系数据库,Java用于中间服务层,web用于UI。语言并不重要。

中间服务层执行数据库的实际查询。UI只是请求特定的数据,并没有数据库支持的概念。

问题是如何处理大型数据集?UI请求数据,但结果可能很大,可能太大而无法放入内存。例如,一个街道标志应用程序可能有一个服务层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StreetSign getStreetSign(int identifier)
Collection<StreetSign> getStreetSigns(Street street)
Collection<StreetSign> getStreetSigns(LatLonBox box)

UI层要求获得满足某些条件的所有街道标志。根据条件的不同,结果集可能会很大。UI层可能会将结果分成单独的页面(对于浏览器),或者只是将它们全部呈现出来(服务于Goolge Earth)。潜在的巨大结果集可能是性能和资源问题(内存不足)。

一种解决方案是不返回完全加载的对象(StreetSign对象)。而是返回某种结果集或迭代器,这些结果集或迭代器懒惰地加载每个对象。

另一种解决方案是更改服务API以返回所请求数据的子集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Collection<StreetSign> getStreetSigns(LatLonBox box, int pageNumber, int resultsPerPage)

当然,UI仍然可以请求一个巨大的结果集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getStreetSigns(box, 1, 1000000000)

我很好奇这个场景的标准行业设计模式是什么?

EN

回答 10

Stack Overflow用户

发布于 2008-10-23 15:39:05

第一个问题应该是:

用户需要或有能力管理这些数据量?

虽然结果集应该是分页的,但如果它的潜在大小如此之大,答案将是“可能不是”,因此UI不应该尝试显示它。

我在医疗保健系统的J2EE项目中工作,这些项目处理海量的存储数据,字面上是数百万的患者,访问,表单等,一般规则是不显示超过100或200行的任何用户搜索,建议用户,这些标准集产生更多的信息,他可以理解。

实现这一点的方法因项目而异,可以强制UI在启动查询之前向服务层询问查询的大小,或者如果结果集增长太多,也可以从服务层抛出异常(但是,这种方式将服务层与UI的有限实现耦合在一起)。

注意!这并不意味着服务层上的每个方法在其结果大小超过100时都必须抛出异常,这条通用规则只适用于直接显示给用户的结果集,这是将控件放在UI中而不是服务层的更好理由。

票数 6
EN

Stack Overflow用户

发布于 2008-10-23 15:33:56

对于这种情况,我见过的最常见的模式是某种分页,通常在服务器端进行,以减少通过网络发送的信息量。

下面是一个使用表变量(通常比临时表更快)的SQL Server 2000示例以及您的街道标志示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE PROCEDURE GetPagedStreetSigns
(
  @Page int = 1,
  @PageSize int = 10
)
AS
  SET NOCOUNT ON

  -- This memory-variable table will control paging
  DECLARE @TempTable TABLE (RowNumber int identity, StreetSignId int)

  INSERT INTO @TempTable
  (
     StreetSignId
  )
  SELECT [Id]
  FROM   StreetSign
  ORDER BY [Id]

  -- select only those rows belonging to the requested page
  SELECT SS.*
  FROM   StreetSign SS
         INNER JOIN @TempTable TT ON TT.StreetSignId = SS.[Id]
  WHERE  TT.RowNumber BETWEEN ((@Page - 1) * @PageSize + 1) 
                      AND (@Page * @PageSize)

在SQL Server2005中,您可以更巧妙地使用诸如公用表表达式和新的SQL排名函数之类的东西。但是一般的主题是使用服务器只返回属于当前页面的信息。

请注意,如果您允许最终用户对正在查看的数据应用动态过滤器,则此方法可能会变得混乱。

票数 2
EN

Stack Overflow用户

发布于 2008-10-23 14:41:13

我想说的是,如果存在大量数据的可能性,那么就采用分页路线。

您仍然可以设置您不希望它们超过的最大值。

例如,所以使用15,30,50的页面大小...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/231827

复制
相关文章
Mybatis的结果集处理 顶
此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。
算法之名
2019/08/20
4K0
如何在JavaScript中处理大量数据
在几年之前,开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了,很多Ajax程序需要在客户端和服务器端传输大量的数据。此外,更新DOM节点的处理在浏览器端来看也是一个很耗时的工作。而且,需要对这些信息进行分析处理的时候也很可能导致程序无响应,浏览器抛出错误。 将需要大量处理数据的过程分割成很多小段,然后通过JavaScript的计时器来分别执行,就可以防止浏览器假死。先看看怎么开始: function ProcessArray(data,handler,callback){ Process
CSDN技术头条
2018/02/09
3K0
Struts2学习---result结果集 result type:全局结果集:动态结果集带有参数的结果集
这一章节主要介绍如何配置结果集,分为以下几个知识点: 结果集类型(result type) 全局结果集(global types) 动态结果集(dynamic type) 带有参数的结果集(type with params) result type: 结果集类型一共有十一种: dispatcher redirect chain redirectAction freemarker httpheader stream velocity xslt plaintext tiles 最常用的是前两种:一个是请求转发
MindMrWang
2018/04/16
1.8K0
SpringBoot 统一结果集处理器
SpringBoot 统一结果集处理器(模板) HttpResponseEnum public enum HttpResponseEnum { /** * 操作成功 */ SUCCESS(20000, "操作成功!"), /** * 没有操作权限 */ AUTHORIZED(40003, "没有操作权限!"), /** * 系统异常 */ SYSTEM_ERROR(50000, "系统异常"),
木字楠
2022/11/15
6210
在机器学习中处理大量数据!
知乎 | https://zhuanlan.zhihu.com/p/357361005
Datawhale
2021/03/26
2.3K0
在机器学习中处理大量数据!
Eclipse中java获得mysql的查询结果集
本文介绍了在Java中如何获取MySQL数据库的查询结果集,并对代码进行了详细的解释和注释。包括使用DriverManager类来加载数据库驱动、使用Connection对象创建与数据库的连接、使用Statement对象创建SQL语句、使用ResultSet对象获取查询结果集、使用next()方法遍历结果集、使用getXXX()方法获取结果集中的数据以及使用close()方法关闭数据库连接。
别先生
2017/12/29
4.9K0
Eclipse中java获得mysql的查询结果集
MySQL | 如何对查询结果集进行排序
数据操作语言:结果集排序 如果没有设置,查询语句不会对结果集进行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY 子句。 SELECT ...... FROM ...... ORDER BY 列名 [ASC | DESC]; SELECT ename,sal FROM t_emp ORDER BY sal; SELECT empno,ename,sal,deptno FROM t_emp ORDER BY sal DESC; 排序关键字 ASC 代表升序(默认),DESC
Zkeq
2022/05/18
6.3K0
MySQL | 如何对查询结果集进行排序
mybatis获取map的key_mybatis怎么处理结果集
CREATE TABLE `job_title_info` ( `_jobtitleid` varchar(255) DEFAULT NULL, `_shortname` varchar(255) DEFAULT NULL, `_fullname` varchar(255) DEFAULT NULL, `_departmentid` varchar(255) DEFAULT NULL, `_jobresponsibility` varchar(255) DEFAULT NULL, `_jobcompetency` varchar(255) DEFAULT NULL, `_jobdoc` varchar(255) DEFAULT NULL, `_jobtitleremark` varchar(255) DEFAULT NULL, `lastChangdate` varchar(255) DEFAULT NULL, `jobactivitycode` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mapper:
全栈程序员站长
2022/11/10
1.5K0
mybatis获取map的key_mybatis怎么处理结果集
如何在施工物料管理Web系统中处理大量数据并显示
最近在开发施工物料管理系统,其中涉及大量的物料信息需要管理和汇总,数据量非常庞大。之前尝试自己通过将原始数据,加工处理建模,在后台代码中通过分组、转置再显示到 Web 页面中,但自己编写的代码量非常大,而且性能很差简直无法忍受。后来使用了矩表控件非常好的解决了需求,本文主要介绍之前如何通过代码将数据展现在页面中,以及使用矩表控件创建行列转置和动态列表格,并显示在网页中。 一、通过代码将数据展现在页面的步骤 1.行列转置代码片段: public static DataTable GetCrossTable(D
葡萄城控件
2018/01/10
2.6K0
如何在施工物料管理Web系统中处理大量数据并显示
快速,实时处理大量数据,架构如何解?
互联网的业务无外乎线上OLTP场景和线下OLAP场景,这两种场景,数据量增大后,我们应该分别怎么应对呢。
架构师之路
2020/08/21
1.3K0
快速,实时处理大量数据,架构如何解?
MyBatis结果集映射
1.typeAliases标签,该标签用于配置全局的别名,配置别名后则不再需要写全名,在映射文件中只需要写配置的别名即可,例如:
端碗吹水
2020/09/23
8110
MyBatis结果集映射
PLSQL Developer中控制结果集表格自动提交
PLSQL Developer可以说是个让人又爱又憎的工具,“爱”是他的确提供了操作Oracle数据库非常丰富、方便的功能,“憎”是他的一些隐藏配置很可能是个“坑”,就像《PLSQL Developer几个可能的隐患》介绍了几个场景。
bisal
2020/07/03
9130
如何快速备份OneDrive for Business中的大量文件
我们经常会遇到一些需要将大量文件进行备份的时候,有可能是工作学习资料,也可能是电影电视,也有可能是给小姐姐们安个家。
陈学谦
2023/01/03
1.3K0
如何快速备份OneDrive for Business中的大量文件
PostgreSQL数据库导入大量数据时如何优化
来源 | OSCHINA 社区、作者 | PostgreSQLChina 链接:https://my.oschina.net/postgresqlchina/blog/5568852 在使用 PostgreSQL 的时候,我们某些时候会往库里插入大量数据,例如,导入测试数据,导入业务数据等等。本篇文章介绍了在导入大量数据时的一些可供选择的优化手段。可以结合自己的情况进行选择。 一、关闭自动提交 关闭自动提交,并且只在每次 (数据拷贝) 结束的时候做一次提交。 如果允许每个插入都独立地提交,那么 Postg
程序猿DD
2022/08/29
1.6K0
MySQL 查询结果中处理字符串
但是如果查询过程中有一个字符串为 null 则整个结果都将是 null ,这时可以将 null 转换为 “
zucchiniy
2019/10/30
4.3K0
多结果集IMultipleResult接口
在某些任务中,需要执行多条sql语句,这样一次会返回多个结果集,在应用程序就需要处理多个结果集,在OLEDB中支持多结果集的接口是IMultipleResult。
Masimaro
2018/08/31
1.1K0
如何将数据库检索的结果导出?
本文介绍了如何将不同数据库的检索结果导出,并提供了具体的数据库名单和导出方法。主要目的是方便用户对检索结果进行进一步处理。
企鹅号小编
2018/01/09
4.3K0
如何将数据库检索的结果导出?
如何取SQL结果集的第一条记录
本文转载自博主编程老高的如何取SQL结果集的第一条记录的博客,特此记录一下。 因为之前使用的SQLServer数据库比较多,今天要查询MySQL数据库中的一张表时查询速度很慢,因为里面存放了base64编码的图片信息,半天打不开表。于是想使用SQLServer中SELECT TOP 1 * FROM t_testTbl;的功能呢。这里以SQLSever、MySQL、Oracle这3种主流关系型数据库为例,看一下对应数据库中是如何取SQL结果集的第一条记录。
ccf19881030
2020/08/25
3.2K0
发现大量TC报文的处理方案
所有使能STP的端口,接收的TC报文计数均在增长。 下图:端口TC报文计数增长对比图
Ponnie
2021/02/24
4.1K0
点击加载更多

相似问题

如何优化从结果集返回的大量数据

12

具有大量mysql结果集的logstash

18

linq限制和过滤大量结果集

13

处理R/ tidyr中的大量嵌套数据集

17

SQL结果集处理

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文