对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
(
  ...
)

每个&lt;查询i-th&gt;是一个相对轻量级的查询,它生成大约100K-1M行,可以在内存中排序,而不会对性能造成显著影响.

结果查询是由上万个多级嵌套并按严格的常规顺序进行的所有查询组成,如深度遍历树,因此结果查询是数十亿行数据集.

所以问题是:由于SQL不保证UNION ALL语句的顺序,外部查询应该包含order BY子句,但服务器硬件无法在要求的时间内对billon行进行排序.

然而,联合查询的顺序是严格确定的,应该是:&lt;查询1-1-1&gt&书信telegram ;问题1-1-2&gt;以此类推,按层次排序,所以实际上外部查询的排序是冗余的,因为数据集按sql查询 struct 排序为already.

有必要强制Postgres保留嵌套的UNION ALL语句的顺序.怎么做?欢迎使用任何插件、扩展,甚至肮脏的黑客攻击.

请避免提及XY类问题的答案和 comments ——问题是以研究的方式表述的.数据库和数据集的 struct 不能因问题的条件而改变.谢谢

推荐答案

试试这个——将查询结果分配到一个临时表中.

  • 创建一个临时表ex.the_temp_table,就像记录类型<QUERY 1-1-1>一样
create temporary table the_temp_table as <QUERY 1-1-1> limit 0;
  • 将自动递增主键列extra_id添加到the_temp_table
alter table the_temp_table add column extra_id serial primary key not null;
  • 然后按照正确的顺序逐个运行所有查询
insert into the_temp_table <QUERY 1-1-1>; insert into the_temp_table <QUERY 1-1-2>;
insert into the_temp_table <QUERY 1-1-3>; insert into the_temp_table <QUERY 1-1-4>;

insert into the_temp_table <QUERY 1-2-1>; insert into the_temp_table <QUERY 1-2-2>;
insert into the_temp_table <QUERY 1-2-3>; insert into the_temp_table <QUERY 1-2-4>;

-- continue 
  • 最后
select <fields list w/o extra_id> from the_temp_table order by extra_id;

-- no sorting is taking place here

因此,您将以可控的方式模拟UNION ALL,而性能损失很小.

Postgresql相关问答推荐

如何在PSQL中查询jsonb列包含字符串的嵌套数组

PostgreSQL解释分析实际时间不加总

Postgres查询按月和年分组的总计数

无法使用PGx连接到Postgres数据库AWS RDS

如何在postgres中测试锁定

Postgres 查询指向国外数据工作者的分区表比直接查询 fdw 慢很多倍

无法使用golang在postgresql中使用自定义类型插入/更新数据

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

使用 select 在带有特殊字符的字符串中查找数据

Heroku Rails 4 无法连接到服务器:connection refused

如何从元组列表中 Select 与多列匹配的行?

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

如何 Select 列值为空的行?

PostgreSQL:如何安装 plpythonu 扩展

如何判断每个组中是否存在值

为 Django Postgres 连接强制 SSL

将主键更改为自动递增

Postgres jsonbNOT contains运算符

如何将参数值添加到 pgadmin sql 查询?

在 OS X 上使用 Postgres.app 时如何将 psql 放在路径上?