高效的 SQL 表合并和分页

Posted

技术标签:

【中文标题】高效的 SQL 表合并和分页【英文标题】:Efficient SQL table merge and paginate 【发布时间】:2020-01-17 16:07:57 【问题描述】:

我有 5 个不同的表,即:

存款 提款 付款 转移 交流

我需要合并这些表并从Nodejs API 返回一个分页结果给客户端。我不知道如何有效地做到这一点,因为这些表真的很大(每个 > 100K 行)。

我正在考虑两种我可以采取的方法。

    将每个表中的单个查询结果流式传输到节点 js 后端,并在那里实现一些合并逻辑。

    以某种方式在数据库级别执行合并,方法是创建某种虚拟表或某些持久视图,然后对其执行查询。

你们觉得呢?

感谢您的宝贵时间!

【问题讨论】:

请显示这些表格的结构,以便我们能够更准确地提供帮助。一般来说,我会说,使用数据库做某事的最高效方式是在数据库上,例如带有视图或带有有效连接的准备好的语句。 在数据库中,是否有一个通用的“事务”表(如果没有,我会感到惊讶)?如果是这样,为什么不从中进行分页呢? 你用的是什么数据库? 有很多方法可以做到这一点,比如非规范化表格。您需要提供有关您的基础架构、数据库、索引以及您希望运行的查询等的更多信息... 出于什么目的需要这些表中的数据?是报告吗?您要根据这些记录进行计算吗? 【参考方案1】:

如果您打算使用 DB 数据进行操作,那么从我的角度来看,最有效的方法是在 DB 级别上,通过 JOIN、UNION 或 Sub queries。如上所述,假设 Node.js 流式传输 concept,对大型数据集采用流式传输始终是一种好习惯。

const request = new sql.Request()
request.stream = true // You can set streaming differently for each request
request.query('select * from verylargetable')

如果您希望将此数据进一步用于其他一些客户端应用程序,您可以考虑使用CSV stringifier Node.js 包,将 SQL 输出数据转换为 CSV 文本格式。

【讨论】:

【参考方案2】:

在不了解表结构的情况下很难提供解决方案。您可以使用通过 INNER JOIN 创建的视图,并使用该视图选择属性以将数据返回给 API 请求,或者您可以直接使用 INNER JOIN 来返回数据。使用过程返回数据。

【讨论】:

以上是关于高效的 SQL 表合并和分页的主要内容,如果未能解决你的问题,请参考以下文章

sql主表分页查询关联子表取任意一条高效方案

oracle 高效分页查询SQL

高效多表分页存储过程,可支持多表查询,任意排序

013.子查询和分页子查询(sql实例)

My Sql 高效分页

ORACLE分页查询SQL语法——高效的分页