对RDBMS Postgresql进行复杂的SQL查询,该查询由多个嵌套的UNION组成,类似于嵌套查询,如下所示:
(
(
(<QUERY 1-1-1> UNION ALL <QUERY 1-1-2>) UNION ALL
(<QUERY 1-1-3> UNION ALL <QUERY 1-1-4>) UNION ALL
...
) UNION ALL
(
(<QUERY 1-2-1> UNION ALL <QUERY 1-2-2>) UNION ALL
(<QUERY 1-2-3> UNION ALL <QUERY 1-2-4>) UNION ALL
...
) UNION ALL
...
) UNION ALL
(
(
(<QUERY 2-1-1> UNION ALL <QUERY 2-1-2>) UNION ALL
(<QUERY 2-1-3> UNION ALL <QUERY 2-1-4>) UNION ALL
...
) UNION ALL
(
(<QUERY 2-2-1> UNION ALL <QUERY 2-2-2>) UNION ALL
(<QUERY 2-2-3> UNION ALL <QUERY 2-2-4>) UNION ALL
...
) UNION ALL
...
) UNION ALL
(
...
)
每个<;查询i-th>;是一个相对轻量级的查询,它生成大约100K-1M行,可以在内存中排序,而不会对性能造成显著影响.
结果查询是由上万个多级嵌套并按严格的常规顺序进行的所有查询组成,如深度遍历树,因此结果查询是数十亿行数据集.
所以问题是:由于SQL不保证UNION ALL语句的顺序,外部查询应该包含order BY子句,但服务器硬件无法在要求的时间内对billon行进行排序.
然而,联合查询的顺序是严格确定的,应该是:<;查询1-1-1>&书信telegram ;问题1-1-2>;以此类推,按层次排序,所以实际上外部查询的排序是冗余的,因为数据集按sql查询 struct 排序为already.
有必要强制Postgres保留嵌套的UNION ALL语句的顺序.怎么做?欢迎使用任何插件、扩展,甚至肮脏的黑客攻击.
请避免提及XY类问题的答案和 comments ——问题是以研究的方式表述的.数据库和数据集的 struct 不能因问题的条件而改变.谢谢