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

问题描述 投票:0回答:1

我需要从具有多个 select 语句的

union all
定义的视图中选择数据(每个表有 500K 条记录),但希望为每条记录生成行号。

查看定义:

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 *
视图继续运行。

是否有更好的方法来实现上述场景?

postgresql window-functions row-number sql-view
1个回答
0
投票

如果您确实需要为每次下一次调用的所有行提供确定性的、无间隙的数字,并且所有基础表的行都可以随时更改,那么这将是非常昂贵的。

但这不是你所展示的。对于初学者来说,没有

row_number() over()
ORDER BY
会产生 任意 数字。自从 Postgres 15 的查询计划中出现“并行追加”以来,从查询返回的行序列实际上可能会无缘无故地发生变化。参见:

这很可能不是您所需要的。数百万行的完全不稳定的、任意的行号几乎没有任何用处。精确定义您的目标,并且可能有一条(大量)更快/更好的路线。

关于

VIEW
MATERIALIZED VIEW
(实际存储数据)的性质的假设可能是错误的?

© www.soinside.com 2019 - 2024. All rights reserved.