gpt4 book ai didi

sql - 分页 UNION ALL 结果 - 最佳性能

转载 作者:行者123 更新时间:2023-12-04 17:50:08 28 4
gpt4 key购买 nike

我们有这样一种情况,我们需要将 4 个不同表的结果合并到一个列表中,并通过 OFFSET/FETCH 对其进行分页。

要从表 a、b、c 和 d 中选择记录,按 CreatedDatetime 排序,然后按 OFFSET X、FETCH Y 排序。表非常大(就行数而言),只执行 UNION 听起来很糟糕ALL 然后分页,因为这可能意味着编译整个记录列表,然后进行分页部分。

问题是没有一个表可以作为提取开始/结束日期时间窗口的引用,因为每个集合可能但也可能不包含来自任何表的记录。例如,结束结果可能包含来自表 a 的任意组合的记录;一/二; a/b/c; A B C D; b; b/c;.... 并且我们需要返回固定大小的数字(分页大小,例如,为 20)。

关于如何最有效地解决这个问题有什么想法吗?

更新

基于@HABO 的问题不幸的是,没有关于查询的特殊线索。我们正在显示系统中的用户事件。它有不同的种类(我们选择的表格)。现在,为查看事件的管理员查询弹出数据。管理员查看数据的方式可能会有很大差异:一些用户在过去几个小时内将进行数千次事件,而管理员会希望查看所有这些事件。在其他情况下,用户一天将进行 3 次操作,而管理员只会看到第一页数据。

附言。它不是一个纯粹的日志表,因为事件随着时间的推移充当状态机,每个都有自己的状态,我们也在这些查询中寻找这些状态。

最佳答案

如果您知道页面大小(例如 100),那么您可以简单地编写 4 个前 100 个查询(按创建日期排序)- 然后对结果执行 Union ALL。这样,即使所有前 100 条记录都来自 1 个表,您也会被覆盖。

对于后续分页查询 - 您需要记录每个表中最后显示的行,并将其用作下一次提取的高水位标记 -(从 TableA 中选择前 100 行,其中 RowID > @HighWater)

应该是相当有效的...

关于sql - 分页 UNION ALL 结果 - 最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718638/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com