postgresql 如何为从视图返回的数百万行生成行号?

7vhp5slm  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(51)

我有从多个选择语句的union all定义视图中选择数据的要求(每个表有50万条记录),但希望为每条记录生成行号。
视图定义:

Create or replace view ABC as
Select * from table_1
union all
Select * from table_2
union all
Select * from table_3
union all
Select * from table_4
union all
Select * from table_5
union all
Select * from table_6
union all
Select * from table_7
union all
.
.
.
.
Select * from table_n

字符串
一旦视图创建,我需要提取数据,但生成返回的到达记录的记录数:

Select *,
   row_number() over() as record_id
from ABC


我试图按照方法,但我无法得到想要的结果,视图上的Select *继续运行。
是否有更好的方法来实现上述场景?

f0ofjuux

f0ofjuux1#

如果您实际上需要为每个下一次调用的所有行提供确定性的、无间隙的数字,并且所有基础表的行可以随时更改,那么代价将非常昂贵。
但这并不是你所展示的。对于初学者来说,没有ORDER BYrow_number() over()会产生任意数字。自从Postgres 15的查询计划中出现“并行追加”以来,从查询返回的行序列实际上可以毫无理由地改变。请参阅:

这很可能不是你所需要的。一个完全不稳定的、任意的行数对于数百万行几乎没有任何用处。精确地定义你的目标,可能会有一个(大大)更快/更好的路线。
也许是对VIEW(基本上只是存储的SELECT查询)与MATERIALIZED VIEW(实际上存储数据)的性质的错误假设?

相关问题